In PHP kann das Einschließen des Ergebnisses eines Funktionsaufrufs in Klammern die Semantik des Ergebnisses ändern, wie im Folgenden gezeigt wird Code:
<code class="php">function get_array() { return array(); } function foo() { // return reset(get_array()); // ^ error: "Only variables should be passed by reference" return reset((get_array())); // ^ OK } foo();</code>
Für dieses rätselhafte Verhalten gibt es keine explizite Erklärung in der offiziellen Dokumentation, sodass Entwickler sich über die zugrunde liegende Mechanik im Unklaren lassen.
Analyse
Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Mehrdeutigkeit der PHP-Sprache beim Parsen von Funktionsaufrufargumenten. Wenn rund um den Funktionsaufruf Klammern hinzugefügt werden, wie in (get_array()), behandelt PHP ihn nicht als Funktionsaufruf, sondern als Ausdruck. Diese Unterscheidung ist entscheidend, da der Opcode, der zum Senden von Variablen verwendet wird (ZEND_SEND_VAR_NO_REF), bei Funktionsaufrufen ein anderes Verhalten als bei Ausdrücken aufweist.
Wenn ZEND_SEND_VAR_NO_REF auf einen Ausdruck trifft, der kein Funktionsaufruf ist, führt er die folgenden Prüfungen durch:
Im bereitgestellten Beispiel die in Klammern gesetzte Funktion call ((get_array())) erfüllt beide Bedingungen:
Infolgedessen fährt der Opcode fort, ohne den Fehler „Nur Variablen sollten als Referenz übergeben werden“ auszulösen. Es ist jedoch wichtig zu beachten, dass dieses Verhalten als Fehler betrachtet wird und man sich im Produktionscode nicht darauf verlassen sollte.
Das obige ist der detaillierte Inhalt vonWarum vermeidet das Klammern eines Funktionsaufrufs in PHP einen Referenzfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!