Dieser Artikel stellt hauptsächlich die Speicherverwaltung von PHP-Variablen vor, die einen bestimmten Referenzwert hat. Jetzt kann ich ihn mit allen teilen, die ihn brauchen.
Jede Computersprache benötigt einige Container, um Variablen zu speichern. Daten. In einigen Sprachen haben Variablen bestimmte Typen, z. B. Zeichenfolgen, Arrays, Objekte usw. C und Pascal fallen beispielsweise in diese Kategorie. PHP hat keinen solchen Typ. In PHP kann eine Variable, die in einer Zeile ein String ist, in der nächsten Zeile zu einer Zahl werden. Variablen können häufig problemlos zwischen verschiedenen Typen konvertiert werden, sogar automatisch. Ein großer Teil der Gründe, warum PHP eine einfache und leistungsstarke Sprache ist, liegt darin, dass sie über schwach typisierte Variablen verfügt. Aber manchmal kann dies zu interessanten Problemen führen.
Intern in PHP werden Variablen in einem Container namens zval gespeichert. Es enthält nicht nur den Wert der Variablen, sondern auch den Typ der Variablen. Python verfügt wie PHP auch über eine Beschriftung zur Kennzeichnung des Variablentyps. Der Variablencontainer enthält einige Felder, die die Zend-Engine verwendet, um zu unterscheiden, ob sie referenziert sind oder nicht. Es enthält auch den Referenzzähler dieses Werts.
Variablen werden in einer Symboltabelle gespeichert, die einem assoziativen Array entspricht. Dieses Array wird durch Variablennamen verschlüsselt und verweist auf Container, die diese Variablen enthalten. Wie unten gezeigt:
PHP versucht, beim Kopieren einiger Variablen (z. B. $a = $b) intelligent zu sein. „=" wird auch Zuweisungsoperator genannt. Beim Ausführen einer Zuweisungsoperation erstellt die Zend-Engine kein neues Variablenfenster, sondern erhöht das Refcount-Feld des Variablenfensters. Sie können sich vorstellen, dass dies der Fall ist Wie viel Speicher ist das, wenn diese Variable eine große Zeichenfolge oder ein riesiges Array ist? gespeichert. Wie in der folgenden Abbildung dargestellt:
Schritt 1: Variable a enthält den Text „this is“. Standardmäßig ist der Referenzzähler gleich 1
Schritt 2: Weisen Sie die Variable $a $b und $c zu. Hier wird kein neuer Variablencontainer generiert, lediglich refcount wird bei jeder Zuweisung einer Variablen um 1 erhöht. Da hier zwei Zuweisungsvorgänge ausgeführt werden, wird refcount schließlich 3.
Jetzt fragen Sie sich vielleicht, was passiert, wenn sich die Variable $c ändert. Abhängig vom Wert von refcount wird dieser auf zwei unterschiedliche Arten verarbeitet. Wenn refcount gleich 1 ist, aktualisiert der Variablencontainer seinen Wert (und möglicherweise auch seinen Typ). Wenn refcount größer als 1 ist, wird ein Variablencontainer erstellt, der den neuen Wert (und Typ) enthält. Wie im dritten Schritt in Abbildung 2 gezeigt, wird der Refcount-Wert des Variablencontainers, in dem sich die Variable $a befindet, um eins subtrahiert. Jetzt beträgt der Refcount-Wert 2 und der Refcount-Wert des neu erstellten Containers ist 1. Wenn die Unset-Funktion für eine Variable verwendet wird, wird der Refcount-Wert des Containers, in dem sich die Variable befindet, um eins reduziert, wie in Schritt 4 der Abbildung gezeigt. Wenn der Wert von refcount kleiner als 1 ist, übersetzt die Zend Engine den Variablencontainer, wie in Schritt 5 der Abbildung gezeigt.
Zusätzlich zur globalen Symboltabelle, die von allen Skripten gemeinsam genutzt wird, erstellt jede benutzerdefinierte Funktion beim Aufruf eine eigene Symboltabelle, die zum Speichern ihrer eigenen Variablen verwendet wird. Wenn eine Funktion aufgerufen wird, erstellt die Zend-Engine eine solche Symboltabelle und die Funktionstabelle wird freigegeben, wenn die Funktion zurückkehrt. Eine Funktion kehrt entweder über eine Return-Anweisung zurück oder kehrt zurück, weil die Funktion endet (Anmerkung des Übersetzers: Funktionen, die nicht zurückkehren, geben standardmäßig NULL zurück). Wie unten gezeigt:
Abbildung 3 zeigt detailliert, wie Variablen an Funktionen übergeben werden.
Im ersten Schritt weisen wir „thisis“ der Variablen $a zu und übergeben diese Variable dann an die Variable $s der Funktion do_something().
Im zweiten Schritt können Sie sehen, dass es sich hierbei um denselben Vorgang wie die Variablenzuweisung handelt (ähnlich dem im vorherigen Abschnitt erwähnten $b = $a), außer dass er in einer anderen Symboltabelle gespeichert ist (Funktionssymboltabelle) und der Referenzzähler wird um 2 statt um 1 erhöht. Der Grund dafür ist, dass der Funktionsstapel auch eine Referenz auf diesen Variablencontainer enthält.
Im dritten Schritt wird, wenn wir der Variablen $s einen neuen Wert zuweisen, der Refcount des ursprünglichen Variablencontainers um 1 reduziert und ein Variablencontainer erstellt, der den neuen Wert enthält.
Im vierten Schritt geben wir eine Variable über die Return-Anweisung zurück. Die zurückgegebene Variable ruft eine Entität aus der globalen Symboltabelle ab und erhöht ihren Refcount um 1. Wenn die Funktion endet, wird die Symboltabelle der Funktion zerstört. Während des Zerstörungsprozesses durchläuft die Zend-Engine jede Variable in der Symboltabelle und reduziert ihren Refcount-Wert. Wenn der Refont-Wert des Variablencontainers 0 wird, wird der Variablencontainer zerstört. Wie Sie sehen, wird der Variablencontainer aufgrund des Referenzzählmechanismus von PHP nicht aus der Funktion kopiert. Wenn die Variable $s im dritten Schritt nicht geändert wurde, verweisen die Variablen $a und $b immer auf denselben Variablencontainer (der Refcount dieses Containers beträgt 2). In diesem Fall erstellt die Anweisung $a = „this is“ keine Kopie des Variablencontainers.
Verwandte Empfehlungen:
php variabler Copy-on-Write-Mechanismus
Das obige ist der detaillierte Inhalt vonSpeicherverwaltung von PHP-Variablen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!