Hallo Martin,
Das ist die Schreibweise eines Array-Literals, das als einziges Element einen String enthält.
Nein.
Dieser Ausdruck enthält:
- $_POST - ein Superglobales Array
- Einen Array-Access Operator []
- Ein String-Literal 'bla'
- Den null-coalescense Operator
- Einen Leerstring
- Einen Array-Access Operator []
- Ein String-Literal 'blub'
Der Term ['blub'] wäre dann und nur dann ein Array-Konstruktor, wenn links davon ein Operator stände (oder der Ausdruck beginnen würde). Es steht aber ein Wert davor. Deshalb ist es der Array-Access Operator. Ja, das ist scheußlich. Und irgendwie kommt PHP damit klar.
Nächste Frage ist die nach der Operatorpriorität. Leider ist die Rangfolgetabelle von PHP hier unvollständig, die Zugriffsoperatoren -> und [] fehlen. Es ist aber aus anderen Sprachen bekannt, dass diese Operatoren ziemlich hoch priorisiert sind. Array Access ist definitiv höher priorisiert als ??.
Solange $_POST['bla'] also einen Wert liefert, wird der Teil rechts vom ?? ignoriert.
Ist $_POST['bla'] nicht belegt, wird der Teil rechts vom ?? ausgewertet. Und das wäre dann ''['blub']. Also: Ein Leerstring, in dem der String-Key 'blub' gesucht wird. Diese Operation ist für Strings nicht zulässig und ein TypeError fliegt.
Was ist mit ($_POST['bla'] ?? '')['blub']
?
Wenn $_POST['bla'] einen Wert liefert, wird der Teil rechts vom ?? ignoriert. Durch die Klammerung wird aber DANN im Inhalt von $_POST['bla'] der String-Key 'blub' gesucht. Was das Gewünschte ist.
Wenn $_POST['bla'] einen Wert liefert, wird der Teil rechts vom ?? ausgewertet. Mit der Folge, dass im Leerstring der String-Key 'blub' gesucht wird. Was einen TypeError auslöst.
Gucken wir uns $_POST['bla']['blub'] ?? ''
an.
Das sind zwei Array Access Operatoren, die werden von links nach rechts ausgeführt.
Ist $_POST['bla'] nicht gesetzt, kommt dabei null 'raus (und eine Meldung). Auf diesen null-Wert wird nun der Array Access Operator angewendet, um 'blub' zu ermitteln. Man würde einen TypeError erwarten. Aber das passiert nicht. Es kommt '' heraus.
Ist $_POST['bla'] auf ein nicht-Array gesetzt, wird ['blub'] auf diesen nicht-Array Wert angewendet. Man würde ebenfalls einen TypeError erwarten. Aber das passiert nicht. Es kommt '' heraus.
Ist $_POST['bla'] auf ein Array gesetzt, wird ['blub'] auf dieser Array angewendet. Ist dort der Key 'blub' enthalten, wird er ausgelesen. Andernfalls kommt null raus (und eine Meldung) und ?? liefert das '' dazu.
Dieser Term tut also genau das gewünschte. Aber warum? Offenbar ist ?? nicht nur ein Lieferant von Ersatzwerten für null, sondern auch für Fehler jeder Art. Sofern sie denn links vom ?? geschehen. Ein Funktionsaufruf, in dem eine Exception fliegt, wird nicht abgefangen.
Rolf
--
sumpsi - posui - obstruxi