Als weit verbreitete Programmiersprache war der zugrunde liegende Betriebsmechanismus von PHP immer der Schwerpunkt der Aufmerksamkeit der Entwickler. In diesem Artikel werden die zugrunde liegenden Entwicklungsprinzipien von PHP7 im Detail erörtert und sich auf die Implementierung von Funktionsaufrufen und variablen Zuordnungen konzentrieren.
In PHP7 werden Funktionsaufrufe über den Anrufstapel verwaltet. Der Call-Stack ist eine LESTO-Datenstruktur (Last-In-First-Out), mit der bei jedem Funktionsaufruf relevante Informationen wie Funktionsnamen und Parameter speichern werden. Nach der Ausführung der Funktion werden die relevanten Informationen von der Spitze des Stapels entfernt.
Hier ist ein Beispiel für einen Funktionsaufruf:
function foo($a, $b) {
return $a + $b;
}
$result = foo(1, 2);
Der Anrufstack ändert sich während der Ausführung: Der Anrufstapel ist zu Beginn des Programms leer; Beim Aufrufen der FOO -Funktion werden die Funktionsinformationen an die Oberseite des Stapels gedrückt. Nach der Ausführung der Funktion tauchen die Informationen von der Spitze des Stapels auf und geben das Ergebnis zurück.
PHP7 -Funktion Aufrufe unterstützen mehrere praktische Argument -Bereitstellungsmethoden:
Referenzpassbeispiel:
function foo(&$a) {
$a = 2;
}
$b = 1;
foo($b);
echo $b; // Ausgabe2
Die Funktion foo empfängt die Adresse der Variablen $ B, sodass die Änderung der formalen Parameter direkt die tatsächlichen Parameter beeinflusst.
In PHP7 verwendet die variable Zuordnung die Referenzzählung, um den Speicher zu verwalten. Die Referenzanzahl zeichnet die Häufigkeit, mit der eine Variable verwiesen wird. Wenn die Anzahl auf Null zurückkehrt, wird der entsprechende Speicher veröffentlicht.
Wenn die Werte zugewiesen wird, wird der variable Wert direkt aktualisiert, wenn die Variablenreferenzzahl 1 ist. Wenn es größer als 1 ist, wird der ursprüngliche Wert kopiert und der neue Wert wird zugewiesen und der alte Speicher wird durch Müllsammlung verarbeitet.
Beispielcode:
$a = 1;
$b = $a;
$c = &$a;
echo $a, $b, $c; // Ausgabe111
$a = 2;
echo $a, $b, $c; // Ausgabe212
Wenn $ B zugewiesen wird, verweisen $ A und $ B auf dieselbe Datenkopie; $ c ist ein Hinweis auf $ a. Bei der Änderung von $ A wird $ C synchron aktualisiert und $ B bleibt der ursprüngliche Wert.
Die Referenzzählung löst keine kreisförmigen Referenzen auf, was zu Speicherlecks führt. Zu diesem Zweck führt PHP7 einen markierten Müllmechanismus für markierte Müllabfuhr ein.
Wenn die Variablenreferenzzahl Null ist, wird sie als Müll markiert. Der Müllsammlungsmechanismus markiert erreichbare Objekte, indem er den Stammsatz durchquert (z. B. globale Variablen und lokale Variablen). Unmarkiert ist Müll und befreit dann das Gedächtnis.
Beispiel für eine kreisförmige Referenz:
class A {
public $b;
}
class B {
public $a;
}
$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;
unset($a, $b);
Hier beziehen sich $ a und $ b aufeinander, wodurch die Referenzzahl nicht auf Null zurückgesetzt wird. Nach der Ausführung des Uneinstellungen erkennt der Müllsammlungsmechanismus unzugängliche kreisförmige Referenzen und recycelt den Speicher rechtzeitig.
Ein tiefes Verständnis der zugrunde liegenden Entwicklungsprinzipien von PHP7, insbesondere des Funktionsaufrufs und der variablen Zuweisungsmechanismus, ist von großer Bedeutung für die Verbesserung der Effizienz der PHP -Entwicklung und der Leistungsoptimierung. Dieser Artikel konzentriert sich auf die Verwaltung des Anrufstacks, der tatsächlichen Parameterablieferungsmethode, des Referenzzählers und des Müllsammers, der den Entwicklern hilft, die Details des PHP7 -Betriebs umfassender zu erfassen.