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



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



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


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

641   5  

5 ответов:

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

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

foo = bar ?: baz;

ориентировочно решает

foo = bar ? bar : baz;

или

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

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

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

foo = foo ?: bar;

это назначить bar до foo если foo null или falsey, иначе он уйдет 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 operator

посмотреть документы:

начиная с 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 сделает это, например:

$param1 = $params['param1'] ?? null;
// Equivalent to:  $param1 = isset($params['param1']) ? $params['param1'] : null;

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

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

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

Comments

    Ничего не найдено.