Я знаю, що це стара тема, але все ж. Я щойно зіткнувся з проблемою в коді, який налагоджую на роботі, і, можливо, у когось може виникнути подібна проблема ...
Скажімо, код виглядає приблизно так:
$positions = $this->positions() || [];
Ви б очікували (як ви звикли, наприклад, від JavaScript), що коли $ this-> положень () повертає помилкові або нульові, $ позиції - це порожній масив. Але це не так. Значення TRUE або FALSE залежить від повернення $ this-> положень ().
Якщо вам потрібно отримати значення $ this-> положень () або порожній масив, ви повинні використовувати:
$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
через коротке замикання, а не через вищий пріоритет.