Klammern und die Bedeutung von Funktionsaufrufergebnissen
Betrachten Sie das folgende Beispiel:
<?php function get_array() { return array(); } function foo() { return reset(get_array()); // Error: "Only variables should be passed by reference" }
In diesem Code Der Fehler tritt auf, weil das Ergebnis des Funktionsaufrufs keine Referenz ist. Wenn das Ergebnis jedoch in Klammern gesetzt wird, verschwindet der Fehler:
function foo() { return reset((get_array())); // OK }
Was passiert hier?
Obwohl es keine Dokumentation gibt, die dieses Verhalten explizit beschreibt, kann es durch Untersuchen verstanden werden die PHP-Grammatik und Compiler-Implementierung.
Auswirkung auf das Parsen
Die Klammern bewirken, dass der PHP-Parser das Ergebnis des Funktionsaufrufs als Ausdruck statt als Variable interpretiert. Dies wirkt sich darauf aus, wie der Compiler den Code interpretiert, insbesondere den Opcode, der zum Senden von Variablen an Funktionen verwendet wird.
Referenzanzahl und Zend-Engine-Optimierung
Die Zend Engine, die Kern-Engine von PHP ermöglicht die Verwendung von Nicht-Referenzvariablen mit einem Referenzzähler von 1 dort, wo Referenzen erwartet werden. Im obigen Beispiel ist das zurückgegebene Array ein neues Objekt mit einem Referenzzähler von 1. Dadurch kann die Zend Engine den Code optimieren und die Fehlermeldung vermeiden.
Einschränkungen
Es ist wichtig zu beachten, dass dieses Verhalten als Fehler betrachtet wird und man sich nicht darauf verlassen sollte. Der Referenzzähler des Funktionsaufrufergebnisses kann sich in zukünftigen PHP-Versionen ändern, wodurch Code beschädigt wird, der von diesem Verhalten abhängt.
Alternative Lösung
Um zu vermeiden, dass man sich auf diese potenziell instabile Situation verlässt Verhalten, weisen Sie das Ergebnis des Funktionsaufrufs explizit einer Variablen zu:
function foo() { $result = get_array(); return reset($result); }
Das obige ist der detaillierte Inhalt vonWarum beheben Klammern den Fehler „Nur Variablen sollten als Referenz übergeben werden' in PHP-Funktionsaufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!