Я видел это сегодня в некотором коде PHP:
$items = $items ?: $this->_handle->result('next', $this->_result, $this);
Я не знаком с ?:
оператор используется здесь. Это похоже на тернарный оператор, но выражение для оценки к тому, если предикат верен, было опущено.Что это значит?
Он оценивает левый операнд, если левый операнд является правдоподобным , а правый операнд - нет.
В псевдокоде
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'
?>
Кстати, это называется оператором Elvis.
Да, это новое в PHP 5.3. Он возвращает либо значение тестового выражения, если оно вычислено как TRUE, либо альтернативное значение, если оно вычислено как FALSE.
Смотрите docs:
Начиная с версии PHP 5.3, можно пропустить среднюю часть тернарного оператора. Выражение
expr1 ?: expr3
возвращаетexpr1
, еслиexpr1
вычисляется вTRUE
, иexpr3
в противном случае.