Eu sei que é um assunto antigo, mas ainda assim. Acabei de encontrar o problema no código que estou depurando no trabalho e talvez alguém possa ter um problema semelhante ...
Digamos que o código seja assim:
$positions = $this->positions() || [];
Você esperaria (como está acostumado a fazer, por exemplo, em javascript) que quando $ this-> position () retornasse falso ou nulo, $ position fosse um array vazio. Mas não é. O valor é TRUE ou FALSE depende do que $ this-> position () retorna.
Se você precisa obter o valor de $ this-> posições () ou array vazio, você tem que usar:
$positions = $this->positions() or [];
EDITAR:
O exemplo acima não funciona como pretendido, mas a verdade é que ||
e or
não é o mesmo ... Tente isto:
<?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";
Este é o resultado:
bool(false)
NULL
array(0) {
}
Portanto, na verdade, a terceira opção ?:
é a solução correta quando você deseja definir o valor retornado ou o array vazio.
$positions = $this->positions() ?: [];
Testado com PHP 7.2.1
$e = true || $x = 'foo'
não definirá$x
por causa de curto-circuito, não por causa de maior precedência.