So che è un vecchio argomento ma ancora. Ho appena incontrato il problema nel codice che sto eseguendo il debug al lavoro e forse qualcuno potrebbe avere un problema simile ...
Diciamo che il codice ha questo aspetto:
$positions = $this->positions() || [];
Ti aspetteresti (come sei abituato ad esempio da javascript) che quando $ this-> position () restituisce false o null, $ position è un array vuoto. Ma non lo è. Il valore è TRUE o FALSE dipende da cosa restituisce $ this-> position ().
Se hai bisogno di ottenere il valore di $ this-> position () o un array vuoto, devi usare:
$positions = $this->positions() or [];
MODIFICARE:
L'esempio sopra non funziona come previsto, ma la verità è che ||
e or
non è la stessa ... Prova questo:
<?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";
Questo è il risultato:
bool(false)
NULL
array(0) {
}
Quindi, in realtà la terza opzione ?:
è la soluzione corretta quando si desidera impostare il valore restituito o un array vuoto.
$positions = $this->positions() ?: [];
Testato con PHP 7.2.1
$e = true || $x = 'foo'
non definirà a$x
causa del cortocircuito, non a causa di una precedenza più elevata.