Я знаю, что это старая тема, но все же. Я только что столкнулся с проблемой в коде, который отлаживаю на работе, и, возможно, у кого-то может быть аналогичная проблема ...
Допустим, код выглядит так:
$positions = $this->positions() || [];
Вы ожидаете (как вы привыкли, например, из javascript), что когда $ this-> position () возвращает false или null, $ position является пустым массивом. Но это не так. Значение TRUE или FALSE зависит от того, что возвращает $ this-> position ().
Если вам нужно получить значение $ this-> position () или пустой массив, вы должны использовать:
$positions = $this->positions() or [];
РЕДАКТИРОВАТЬ:
Приведенный выше пример не работает по назначению , но истина заключается в том , что ||
и or
это не то же самое ... Попробуйте это:
<?php
function returnEmpty()
{
//return "string";
//return [1];
return null;
}
$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];
var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";
Вот результат:
bool(false)
NULL
array(0) {
}
Итак, на самом деле третий вариант ?:
- правильное решение, когда вы хотите установить возвращаемое значение или пустой массив.
$positions = $this->positions() ?: [];
Протестировано с PHP 7.2.1
$e = true || $x = 'foo'
не будет определять$x
из-за короткого замыкания, а не из-за более высокого приоритета.