Он оценивает левый операнд, если левый операнд верный , а правый операнд - в противном случае.
В псевдокоде,
foo = bar ?: baz;
грубо решается на
foo = bar ? bar : baz;
или
if (bar) {
foo = bar;
} else {
foo = baz;
}
с той разницей, что bar
будет оцениваться только один раз.
Вы также можете использовать это для «самопроверки», foo
как показано в примере кода, который вы разместили:
foo = foo ?: bar;
Это будет назначать bar
в foo
случае foo
равна нулю или 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'
?>
Кстати, это называется оператор Элвиса .
null
или что-то еще. Просто||
. Так чтоblah || 'default'
?||
оператор всегда возвращает логическое значение.Смотрите документы :
источник
expr2
- то, что это просто исчезло, и не оценено.$this->expensiveComputation() ?: "nope"
не идентичен$this->expensiveComputation() ? $this->expensiveComputation() : "nope"
- expr1 вычисляется только один раз.Будьте осторожны с массивами. Мы должны написать проверочную переменную после
?
, потому что:обновленный
Из RFC. В будущем (в PHP 7) это сделает оператор Null Coalesce Operator , например:
источник
Еще одно важное соображение: оператор Элвиса нарушает процесс токенизации Zend Opcache. Я нашел это трудным путем! Хотя это могло быть исправлено в более поздних версиях, я могу подтвердить, что эта проблема существует в PHP 5.5.38 (со встроенным Zend Opcache v7.0.6-dev).
Если вы обнаружите, что некоторые из ваших файлов «отказываются» кэшироваться в Zend Opcache, это может быть одной из причин ... Надеюсь, это поможет!
источник
Да, это новое в PHP 5.3. Он возвращает либо значение тестового выражения, если оно оценено как ИСТИНА, либо альтернативное значение, если оно оценено как ЛОЖЬ.
источник
TRUE
.