?: оператор ("оператор Элвиса") в PHP

Я видел это сегодня в некотором коде PHP:

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

Я не знаком с ?: оператор используется здесь. Это похоже на троичный оператор, но выражение для оценки, если предикат истинен, было опущено. Что это значит?

7 ответов

Решение

Он оценивает левый операнд, если левый операнд верный, а правый операнд - в противном случае.

В псевдокоде,

foo = bar ?: baz;

грубо решается на

foo = bar ? bar : baz;

или же

if (bar) {
    foo = bar;
} else {
    foo = baz;
}

с той разницей, что bar будет оцениваться только один раз.

Вы также можете использовать это для "самопроверки" foo как показано в примере кода, который вы разместили:

foo = foo ?: bar;

Это назначит 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'
?>

Кстати, это называется оператор Элвиса.

Элвис оператор

Смотрите документы:

Начиная с 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;

Оператор Элвиса:

?:- оператор Элвиса. Это бинарный оператор, который выполняет следующие действия:

Принуждает значение слева от ?: в логическое значение и проверяет, является ли оно true. Если true он вернет выражение с левой стороны, если false, то вернет выражение с правой стороны.

Пример:

var_dump(0 ?: "Expression not true");     // expression returns: Expression not true
var_dump("" ?: "Expression not true");    // expression returns: Expression not true
var_dump("hi" ?: "Expression not true");  // expression returns string hi
var_dump(null ?: "Expression not true");  // expression returns: Expression not true
var_dump(56 ?: "Expression not true");    // expression return int 56

Когда использовать:

Оператор Элвиса - это в основном сокращенный синтаксис для конкретного случая тернарного оператора, который:

$testedVar ? $ testedVar : $otherVar;

Оператор Элвиса сделает синтаксис более логичным следующим образом:

$testedVar ?: $otherVar;

Еще одно важное соображение: оператор Элвиса нарушает процесс токенизации Zend Opcache. Я нашел это трудным путем! Хотя это могло быть исправлено в более поздних версиях, я могу подтвердить, что эта проблема существует в PHP 5.5.38 (со встроенным Zend Opcache v7.0.6-dev).

Если вы обнаружите, что некоторые из ваших файлов "отказываются" кэшироваться в Zend Opcache, это может быть одной из причин... Надеюсь, это поможет!

Да, это новое в PHP 5.3. Он возвращает либо значение тестового выражения, если оно оценивается как TRUE, либо альтернативное значение, если оно оценивается как FALSE.

я думаю, что целью является условное выполнение:

      $a ?: func(); 

результаты в func() будут выполняться только в том случае, если $a имеет значение, которое разрешается в FALSE. он может использоваться как сокращение от

      if(!$a){
    func();
}

присваивание не является обязательным $a = $a ?: функция func() выглядит так:

      if(!$a){
    $a = func();
}
Другие вопросы по тегам