Heim  >  Artikel  >  Backend-Entwicklung  >  Vertiefendes Verständnis der PHP-Prinzipien: Variablenbereich (Scope in PHP)

Vertiefendes Verständnis der PHP-Prinzipien: Variablenbereich (Scope in PHP)

angryTom
angryTomnach vorne
2019-10-15 13:43:222054Durchsuche

Vertiefendes Verständnis der PHP-Prinzipien: Variablenbereich (Scope in PHP)

Im vorherigen Artikel (Variablen in PHP) wurde die interne Darstellung von PHP-Variablen vorgestellt, aber das Problem ist, wie interagieren diese internen Darstellungen mit Benutzerskripten? Womit sind die Variablen verknüpft? Das heißt, wenn ich im Skript schreibe:

<?php
  $var = "laruence";
  echo $var;
?>

Wie verbindet ZE meine Variable var mit der internen Struktur zval?

Wie im ausführlichen Verständnis von Variablen in PHP-Prinzipien erwähnt, verwendet PHP intern zval, um Variablen darzustellen, aber für das obige Skript haben unsere Variablen Namen, var. In zval gibt es kein entsprechendes Feld, das den Variablennamen widerspiegelt.

Wenn Sie darüber nachdenken, muss es in PHP einen Mechanismus geben, um Variablennamen zval zuzuordnen. Dann bist du wirklich schlau, ;)

Empfohlenes Lernen: PHP-Video-Tutorial

In PHP werden alle Variablen in einem Array gespeichert (Hash-Tabelle um genau zu sein), und PHP implementiert Variablen auch über verschiedene Arrays des Bereichs.

Wenn Sie eine Variable erstellen, weist PHP der Variablen einen zval zu, gibt den entsprechenden Variablenwert ein und fügt dann den Namen der Variablen und den Zeiger auf den zval in ein Array ein. Wenn Sie dann diese Variable erhalten, ruft PHP den entsprechenden zval ab, indem es dieses Array nachschlägt.

Sehen Sie sich die Struktur _zend_executor_globals an (diese Struktur speichert einige ausführungsbezogene Kontextinformationen im PHP-Executor)

struct _zend_executor_globals {
 
     ....
    HashTable *active_symbol_table;/*活动符号表*/
    HashTable symbol_table;     /*全局符号表*/
 
    HashTable included_files;
 
    jmp_buf *bailout;
    int error_reporting;
     .....
}

Darunter globale Symboltabelle , speichert Variablen im Bereich der obersten Ebene (d. h. nicht innerhalb einer Funktion oder eines Objekts). Immer wenn eine Funktion (Methode eines Objekts) aufgerufen wird, wird für diese Funktion eine aktive Symboltabelle erstellt und alle innerhalb dieser Funktion definierten Variablen werden in dieser aktiven Symboltabelle gespeichert.

Ja, so wird der Variablenbereich von PHP implementiert! Zum Beispiel:

<?php
     $var = "I am in the global symbol table";
    function sample($para){
        $var = "I am in the active symbol table";
          echo $var;
      }
    sample($var);
    echo $var;
  ?>

Die Variable $var außerhalb des Funktionsbeispiels wird in die globale Symboltabelle gefüllt und entspricht einem Zval Zeiger, der eine Zeichenfolge „Ich bin in der globalen Symboltabelle“

$var in der Funktion speichert, wird sie in die zum Funktionsbeispiel gehörende aktive Symboltabelle gefüllt, ebenso die Zeichenfolge „Ich bin in der aktiven Symboltabelle“ wird in dem dazugehörigen zval gespeichert.

Das Besondere ist der Parameter $para der Funktion „sample“. Dieser $para wird in der aktiven Symboltabelle des Beispiels gespeichert, aber der entsprechende zval-Zeiger darauf zeigt auf ein zval, das eine Kopie der globalen Variablen $var enthält (genau genommen handelt es sich nicht um eine Kopie, sondern um eine Referenz).

Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis der PHP-Prinzipien: Variablenbereich (Scope in PHP). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:www.laruence.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen