오늘 PHP 코드에서 이것을 보았습니다.
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
?:
여기에 사용되는 연산자에 익숙하지 않습니다 . 삼항 연산자처럼 보이지만 술어가 참인지 평가하는 표현식은 생략되었습니다. 무슨 뜻인가요?
답변
왼쪽 피연산자가 true 이면 왼쪽 피연산자를 평가하고 그렇지 않으면 오른쪽 피연산자를 평가합니다.
의사 코드에서
foo = bar ?: baz;
대략적으로 해결하다
foo = bar ? bar : baz;
또는
if (bar) {
foo = bar;
} else {
foo = baz;
}
bar
한 번만 평가 되는 차이점이 있습니다.
이 foo
코드를 사용하여 게시 한 코드 예제에서 설명한 “자체 검사”를 수행 할 수도 있습니다 .
foo = foo ?: bar;
이것은 null 또는 false 인 경우에 할당 bar
되며 , 그렇지 않으면 변경되지 않습니다.foo
foo
foo
몇 가지 예 :
<?php
var_dump(5 ?: 0); // 5
var_dump(false ?: 0); // 0
var_dump(null ?: 'foo'); // 'foo'
var_dump(true ?: 123); // true
var_dump('rock' ?: 'roll'); // 'rock'
?>
그건 그렇고, Elvis 연산자 라고합니다 .
답변
문서를 참조하십시오 :
PHP 5.3부터는 삼항 연산자의 중간 부분을 생략 할 수 있습니다. 로 평가 되면 식이
expr1 ?: expr3
반환 되고 그렇지 않으면 식이 반환expr1
됩니다 .expr1
TRUE
expr3
답변
배열에주의하십시오. 다음에 검사 변수를 작성해야합니다 ?
.
$params = ['param1' => 'value1',
'param2' => 'value2',
'param3' => 'value3',];
$param1 = isset($params['param1'])?:null;
$param2 = !empty($params['param2'])?:null;
$param3 = $params['param3']?:null; // get E_NOTICE, if $params['param3'] eq false
var_dump($param1,$param2,$param3);
true // would like to expect `value1`
true // would like to expect `value2`
param3 // properly, but problem above
업데이트
RFC에서. 앞으로 (PHP 7에서) 연산자 Null Coalesce Operator 가 다음과 같이 할 것입니다.
$param1 = $params['param1'] ?? null;
// Equivalent to: $param1 = isset($params['param1']) ? $params['param1'] : null;
답변
또 다른 중요한 고려 사항 : Elvis Operator는 Zend Opcache 토큰 화 프로세스를 중단합니다. 나는 이것이 어려운 길을 찾았다! 이것은 이후 버전에서 수정되었을 수도 있지만,이 문제가 PHP 5.5.38 (내장 Zend Opcache v7.0.6-dev)에 존재 함을 확인할 수 있습니다.
일부 파일이 Zend Opcache에 캐싱되는 것을 ‘거부’한다는 것을 알게되면 이것이 이유 중 하나 일 수 있습니다.
답변
예, 이것은 PHP 5.3의 새로운 기능입니다. TRUE로 평가되면 테스트 표현식의 값을, FALSE로 평가되면 대체 값을 리턴합니다.