많은 프로그래밍 언어에는 병합 기능이 있습니다 ( 예 : 첫 번째 NULL이 아닌 값을 반환 함 ). 슬프게도 2009 년에 PHP는 그렇지 않습니다.
PHP 자체가 통합 기능을 얻을 때까지 PHP에서 구현하는 좋은 방법은 무엇입니까?
많은 프로그래밍 언어에는 병합 기능이 있습니다 ( 예 : 첫 번째 NULL이 아닌 값을 반환 함 ). 슬프게도 2009 년에 PHP는 그렇지 않습니다.
PHP 자체가 통합 기능을 얻을 때까지 PHP에서 구현하는 좋은 방법은 무엇입니까?
답변:
PHP 5.3에는 새로운 연산자가 있습니다. ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
반환 하고를 반환합니다 false
. 운영자는 제정신입니다.
PHP 7은 실제 통합 연산자를 도입했습니다 .
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
(가)하기 전에 값 경우 ??
하지 않습니다 존재이거나 null
이 후 값을 ??
가져옵니다.
언급 된 ?:
연산자에 비해 개선 된 점은 ??
을 던지지 않고 정의되지 않은 변수도 처리한다는 것 E_NOTICE
입니다.
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over 의 장점은 ??
빈 값을 통합하고 ??
그렇지 않은 빈 값을 통합한다는 것 입니다. 자바 스크립트 (즉의 논리 OR 연산자의 동작과 유사 $val || 'default'
), 나는 찾을 것 ?:
보다 실제적인 형태로 병합 우리가 궁극적으로 자신을 모두 처리 찾아 우리의 연습하면 빈 과 널 (null) 같은 방법으로 (즉,에서 $val ?: 'default'
). 그리고 당신 E_NOTICE
이이 문제를 더 강요하고 삼키고 싶다면 , 당신은 이것을 다음 과 같이 주장 할 수 있습니다 :echo @$val ?: 'default';
Google에서 "php coalesce"를 처음 방문했습니다.
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
나는 정말로? : 연산자를 좋아한다. 불행히도 아직 프로덕션 환경에서 구현되지 않았습니다. 그래서 나는 이것과 동등한 것을 사용합니다 :
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
해야합니다 -포함하는 null이 아닌 첫 번째 인수 를 반환해야합니다 FALSE
. 이 함수는 FALSE
op가 생각한 것이 아니라 (적어도 내가 coalesce
함수에서 원하지 않는 것은 아닙니다) 버릴 것 입니다.
PHP가 초기화되지 않은 변수와 배열 인덱스를 처리했기 때문에 모든 종류의 병합 함수는 제한적으로 사용됩니다. 나는 이것을 할 수 있기를 바랍니다.
$id = coalesce($_GET['id'], $_SESSION['id'], null);
그러나 이것은 대부분의 경우 PHP가 E_NOTICE와 함께 오류를 발생시킵니다. 변수를 사용하기 전에 변수의 존재를 테스트하는 유일한 안전한 방법은 empty () 또는 isset ()에서 직접 사용하는 것입니다. 통합의 모든 옵션이 초기화 된 것으로 알려진 경우 Kevin이 제안한 3 항 연산자가 가장 좋습니다.
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).
이 기능이 특정 유형에서 작동하는 방식을 정확하게 식별하십시오. PHP에는 다양한 유형 검사 또는 유사한 기능이 있으므로 작동 방식을 알아야합니다. is_null ()과 empty ()을 비교 한 예제입니다.
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
보시다시피 empty ()는이 모든 것에 대해 true를 반환하지만 is_null ()은 그 중 2에 대해서만 true를 반환합니다.
Ethan Kent가 게시 한 답변을 확장하고 있습니다. 이 답변은 array_filter 의 내부 작업으로 인해 null로 평가되는 null이 아닌 인수를 삭제 coalesce
합니다. 이 함수는 일반적으로 함수가 수행하지 않습니다. 예를 들면 다음과 같습니다.
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
죄송합니다
이를 극복하기 위해 두 번째 인수와 함수 정의가 필요합니다. 호출 기능은 말에 대한 책임이 array_filter
결과 배열에 현재 배열 값을 추가할지 여부를 :
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
단순히 isset
또는 'isset'
에 두 번째 인수로 전달할 수 있다면 array_filter
좋지만 그러한 행운은 없습니다.
클로저가있는 PHP 5.3 이상 :
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
??