Sé que es un tema antiguo, pero aún así. Acabo de encontrar el problema en el código que estoy depurando en el trabajo y tal vez alguien pueda tener un problema similar ...
Digamos que el código se ve así:
$positions = $this->positions() || [];
Usted esperaría (como está acostumbrado a, por ejemplo, javascript) que cuando $ this-> posiciones () devuelve falso o nulo, $ posiciones es una matriz vacía. Pero no lo es. El valor es VERDADERO o FALSO depende de lo que devuelva $ this-> posiciones ().
Si necesita obtener el valor de $ this-> posiciones () o una matriz vacía, debe usar:
$positions = $this->positions() or [];
EDITAR:
El ejemplo anterior no funciona como se esperaba pero la verdad es que ||
y or
no es lo mismo ... Prueba esto:
<?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 es el resultado:
bool(false)
NULL
array(0) {
}
Entonces, en realidad, la tercera opción ?:
es la solución correcta cuando desea establecer un valor devuelto o una matriz vacía.
$positions = $this->positions() ?: [];
Probado con PHP 7.2.1
$e = true || $x = 'foo'
no se definirá$x
debido a un cortocircuito, no debido a una mayor precedencia.