2016-10-05 24 views
1

PHP 문서에 따르면, 널 병합 연산자 ?? 잘 연관이의 오른쪽 연관성, 즉PHP의 널 (null) 병합 연산자

$a ?? $b ?? $c 

$a ?? ($b ?? $c) 

이것의 의미는 무엇인가에 해당? 개발자가 왼쪽 연관성 또는 오른쪽 연관성이라는 점에서 차이점이 있습니까?

function f(string $a) : string { 
    echo "f($a)\n"; 
    return $a; 
} 
var_dump(f("a") ?? f("b") ?? f("c") ?? f("d")); 
echo "===\n"; 
var_dump(((f("a") ?? f("b")) ?? f("c")) ?? f("d")); 

출력 :

왼쪽 피연산자가 내 테스트에 따라 null가 아닌 경우 오른쪽 피연산자는 평가되지 않기 때문에 덜 함수를 호출합니다 생각하는 사람들에게

, 이것은 사실이 아니다

f(a) 
string(1) "a" 
=== 
f(a) 
string(1) "a" 
+0

'$의 A','$의 b'와'$의 c'는 다음이 완전히 다른 실행으로 이어질 것입니다 기능이 될 경우이 남아있는 경우 또는 오른쪽 연관을 간단한 예제로 사용하십시오. '?? '에 다른 연산자를 사용하면 코드가 완전히 다른'연관성 '에 따라 같은 결과가 발생합니다. – Rizier123

+0

@ Rizier123 지금 하시겠습니까? https : // 3v4l.org/PvvSr – deceze

+0

FWIW, 왼쪽 연관 '??'연산자가 누적 된 '??'연산자와 조합하여 다른 결과를 생성하는 경우를 생각할 수 없습니다. 내부 단락과 관련이있는 것으로 보인다. 즉 왼쪽 연관 '??'연산자는 가능한 한 빨리 반환하는 대신 모든 누적 표현식 (피연산자가 아닌 경우에도)을 항상 평가합니다. 당신은 다른 통신 수와 그것을 결합하는 다른 행동을 찾아 낼지도 모른다. – deceze

답변

-1

작동합니다 (첫 번째 값이 null 이외의 경우) 왼쪽 연관성이있는 경우 한 번만 오른쪽 연관성이있는 경우에만 표시됩니다. 이 두 사례를 비교해

(("a" ?? "b") ?? "c") ?? "d" 
"a" ?? ("b" ?? ("c" ?? "d")) 

를 첫 번째 행, 제 2 (내측)이 해결 ?? "b" 괄호 후, 제 (외측) 안의 값은 최종 ?? "d" 해결된다 ?? "c"가 해결 괄호. ??은 3 번 수행됩니다.

두 번째 줄에서는 "a"이 null이 아니므로 ("b" ?? ("c" ?? "d"))의 전체 청크를 확인할 필요가 없습니다. ??은 한 번만 수행됩니다.

오른쪽 값이 확인되지는 않지만 !== null을 확인하는 것이 여전히 도움이 될 수 있습니다.

(이 유일한 이유 인 경우 여전히 궁금해?)

-2

이 중요성은 무엇입니까? (왼쪽 연관된다) 원계 운영자에 비해

가되는 널 병합 연산자 오른쪽 연관 적층을 허용한다. 예를 들어 :

이이 당신이 삼항 연산자는 C 또는 C++에서 오는 기본적으로 작동 할 것으로 예상하는 방법입니다

echo isset($foo) ? $foo : 
    isset($bar) ? $bar : 
    isset($baz) ? $baz : 
    'default'; 

작동하지 않습니다,하지만 당신은 잘못된 것입니다. 새로운 ?? 연산자는 다음과 같은 대안을 수 있습니다 :

이것은 당신이 ?? 여러 번 평가가 성능 문제에 대해 생각하고

echo $foo ?? $bar ?? $baz ?? 'default'; 
+1

왼쪽 연관을 사용하면 무엇이 잘못됩니까? 즉 (($ foo ?? $ bar)? $ baz) ?? 'default''? – SOFe

+0

@PEMapModder 아무 것도 잘못되었습니다, 그것은 단지 청결한/통사론적인 설탕입니다. –

+0

그런 다음 질문에 대답하지 않습니다. "청결한/통사론 설탕"은 순전히 의견을 바탕으로 한 것 같다. – SOFe