Heim  >  Artikel  >  Backend-Entwicklung  >  Warum vermeidet das Klammern eines Funktionsaufrufs in PHP einen Referenzfehler?

Warum vermeidet das Klammern eines Funktionsaufrufs in PHP einen Referenzfehler?

Susan Sarandon
Susan SarandonOriginal
2024-10-26 22:35:30166Durchsuche

Why Does Parenthesizing a Function Call in PHP Avoid a Reference Error?

Klammern und Semantik von Funktionsaufrufen in PHP

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:

  1. Das Argument ist kein Funktionsaufruf.
  2. Das Argument ist entweder eine Referenz oder hat einen Referenzzähler von 1.

Im bereitgestellten Beispiel die in Klammern gesetzte Funktion call ((get_array())) erfüllt beide Bedingungen:

  1. Es wird aufgrund der zusätzlichen Klammern nicht als Funktionsaufruf erkannt.
  2. Das zurückgegebene Array hat einen Referenzzähler von 1 da nur innerhalb des Funktionsaufrufs darauf verwiesen wird.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn