[php] ? : PHP의 연산자 ( ‘Elvis 연산자’)

오늘 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되며 , 그렇지 않으면 변경되지 않습니다.foofoofoo

몇 가지 예 :

<?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됩니다 .expr1TRUEexpr3


답변

배열에주의하십시오. 다음에 검사 변수를 작성해야합니다 ?.

  $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로 평가되면 대체 값을 리턴합니다.


답변