Wiem, że to stary temat, ale jednak. Właśnie spotkałem się z problemem w kodzie, który debuguję w pracy i może ktoś może mieć podobny problem ...
Powiedzmy, że kod wygląda następująco:
$positions = $this->positions() || [];
Można by się spodziewać (jak przyzwyczaiłeś się np. Z javascript), że gdy $ this-> position () zwróci false lub null, to $ position jest pustą tablicą. Ale tak nie jest. Wartość PRAWDA lub FAŁSZ zależy od tego, co zwraca $ this-> position ().
Jeśli chcesz uzyskać wartość $ this-> position () lub pustą tablicę, musisz użyć:
$positions = $this->positions() or [];
EDYTOWAĆ:
Powyższy przykład nie działa zgodnie z przeznaczeniem, ale prawda jest taka, że ||
i or
nie jest to samo ... Spróbuj tego:
<?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";
Oto wynik:
bool(false)
NULL
array(0) {
}
Tak więc w rzeczywistości trzecia opcja ?:
jest poprawnym rozwiązaniem, gdy chcesz ustawić zwracaną wartość lub pustą tablicę.
$positions = $this->positions() ?: [];
Testowane w PHP 7.2.1
$e = true || $x = 'foo'
nie zdefiniuje z$x
powodu zwarcia, nie z powodu wyższego priorytetu.