2017-10-01 20 views
2

새로운 PHP7 null 병합 연산자를 삼항 연산자와 함께 사용할 때 예기치 않은 동작이 발생합니다.PHP null 병합 + 삼항 연산자 이상한 동작

구체적인 상황 (더미 코드)

function a() 
{ 
    $a = 1; 
    $b = 2; 
    return $b ?? (false)?$a:$b; 
} 

var_dump(a()); 

결과는 INT (1).

아무도 나를 설명 할 수 있습니까?

+4

전에 평가되기 때문에, 난 항상 명시 적으로이 같은 표현식에 괄호를 사용하여 내 코드를 사용하여 추가 괄호를 추가 할 필요가없는 ($b ?? (false)) ? $a : $b;

. 나는 나의 의도를 진술하고 선행이나 다른 부작용에 의지하지 않는다. –

+0

그게 좋은 지적이고 나쁜, 감사합니다 – Aldos

답변

4

공백은 PHP가 표현식을 평가하는 방식을 반영하지 않습니다. ??에는 3 진 표현식보다 higher precedence이 있습니다. 한 $bnull하지 않거나 false로 평가 $a입니다

($b ?? false) ? $a : $b; 

:

당신은 결과를 얻을.

+0

내가 볼, 당신에게 감사합니다 – Aldos

3

return $b ?? (false)?$a:$b;

이 먼저 문을 검사는 $b ?? (false) 그 결과 다음 ? $a:$b에 전달되는 평가; 인 $a 값을 반환

($b) ? $a : $b :식이된다 위에

$b ?? (false) 수단은, 실제 틱 값이 경우 $b = 2 이후 $b

인 제 not null and isset 값, 수득 int(1)

원래의 진술을 다음과 같이 생각하면이 모든 것이 더 잘 이해 될 것입니다.

반환 우리는 ?? 내 자신의 정신 및 향후 코더를 위해서 ?

+0

도 감사합니다, 너무 감사합니다 – Aldos