Ich weiß, dass es ein altes Thema ist, aber immer noch. Ich habe gerade das Problem in dem Code getroffen, den ich bei der Arbeit debugge, und vielleicht hat jemand ein ähnliches Problem ...
Angenommen, der Code sieht folgendermaßen aus:
$positions = $this->positions() || [];
Sie würden erwarten (wie Sie es von z. B. Javascript gewohnt sind), dass $ positions ein leeres Array ist, wenn $ this-> positions () false oder null zurückgibt. Aber es ist nicht so. Der Wert TRUE oder FALSE hängt davon ab, was $ this-> positions () zurückgibt.
Wenn Sie den Wert von $ this-> positions () oder ein leeres Array erhalten möchten, müssen Sie Folgendes verwenden:
$positions = $this->positions() or [];
BEARBEITEN:
Das obige Beispiel funktioniert nicht wie beabsichtigt , aber die Wahrheit ist , dass ||
und or
ist nicht das gleiche ... Versuchen Sie folgendes:
<?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";
Das ist das Ergebnis:
bool(false)
NULL
array(0) {
}
Die dritte Option ?:
ist also die richtige Lösung, wenn Sie einen zurückgegebenen Wert oder ein leeres Array festlegen möchten.
$positions = $this->positions() ?: [];
Getestet mit PHP 7.2.1
$e = true || $x = 'foo'
wird nicht$x
wegen Kurzschluss definiert, nicht wegen höherer Priorität.