Was genau sind späte statische Bindungen in PHP?
quelle
Was genau sind späte statische Bindungen in PHP?
Sie müssen unbedingt Late Static Bindings im PHP-Handbuch lesen . Ich werde jedoch versuchen, Ihnen eine kurze Zusammenfassung zu geben.
Grundsätzlich self
läuft es darauf hinaus, dass das Schlüsselwort nicht denselben Vererbungsregeln folgt. self
wird immer in die Klasse aufgelöst, in der es verwendet wird. Dies bedeutet, dass, wenn Sie eine Methode in einer übergeordneten Klasse erstellen und von einer untergeordneten Klasse aus aufrufen, self
das untergeordnete Element nicht wie erwartet referenziert wird.
Durch die späte statische Bindung wird eine neue Verwendung für das static
Schlüsselwort eingeführt, mit der dieses spezielle Manko behoben wird. Wenn Sie verwenden static
, stellt es die Klasse dar, in der Sie es zuerst verwenden, d. H. es 'bindet' an die Laufzeitklasse.
Das sind die beiden Grundkonzepte dahinter. Die Art und Weise self
, parent
und static
arbeitet , wenn static
im Spiel ist subtil sein kann, so anstatt zu gehen, um Details, würde ich empfehlen , dass Sie die Manpage Beispiele zu studieren. Sobald Sie die Grundlagen der einzelnen Keywords verstanden haben, sind die Beispiele sehr wichtig, um zu sehen, welche Ergebnisse Sie erzielen werden.
self
Schlüsselwort folgt nicht den Vererbungsregeln. Es wirdself
immer in die Klasse aufgelöst, in der es verwendet wird." - Das bedeutet nicht, dass Sie die statische Methode eines Elternteils nichtself
wie bei nicht statischen Methoden von einem untergeordneten Objekt aus aufrufen können. Sie meinen vielleicht das Richtige, aber Sie sollten das umformulieren. Es ist alles nur dann wirklich wichtig, wenn Kinder identisch benannte Mitglieder haben, da Sie dann entscheiden können, auf welche Mitglieder Sie sich beziehen möchten, indem Siestatic::
stattdessen verwenden.Von PHP: Late Static Bindings - Handbuch :
Sehen wir uns ein Beispiel an:
quelle
Es gibt kein sehr offensichtliches Verhalten:
Der folgende Code erzeugt 'alphabeta'.
Wenn wir jedoch die Deklaration der Klassennamenfunktion aus der Beta-Klasse entfernen, erhalten wir als Ergebnis 'alphaalpha'.
quelle
Ich zitiere aus dem Buch: "PHP Master schreibt topaktuellen Code".
Schauen Sie sich auch die offizielle PHP-Dokumentation an: http://php.net/manual/en/language.oop5.late-static-bindings.php
Die Erklärung der späten statischen Bindung lässt sich am einfachsten anhand eines einfachen Beispiels erklären. Schauen Sie sich die beiden folgenden Klassendefinitionen an und lesen Sie weiter.
Wir sehen eine Elternklasse (Fahrzeug) und eine Kinderklasse (Auto). Die Elternklasse verfügt über zwei öffentliche Methoden:
invokeDriveByStatic
invokeStopBySelf
Die Elternklasse hat auch zwei private Methoden:
drive
stop
Die untergeordnete Klasse überschreibt zwei Methoden:
drive
stop
Rufen wir nun die öffentlichen Methoden auf:
invokeDriveByStatic
invokeStopBySelf
Fragen Sie sich: Welche Klasse ruft
invokeDriveByStatic
/ aufinvokeStopBySelf
? Die Eltern- oder Kinderklasse?Schauen Sie unten nach:
Das
static
Schlüsselwort wird in einem Singleton-Entwurfsmuster verwendet. Siehe Link: https://refactoring.guru/design-patterns/singleton/php/examplequelle
Das einfachste Beispiel, um den Unterschied zu zeigen.
Beachten Sie, self :: $ c
Späte statische Bindung, beachten Sie static :: $ c
quelle
Beispielsweise:
quelle
Betrachten Sie es aus einem "Warum sollte ich das verwenden?" Perspektive ist es im Grunde eine Möglichkeit, den Kontext zu ändern, aus dem die statische Methode interpretiert / ausgeführt wird.
Mit
self
ist der Kontext derjenige, in dem Sie die Methode ursprünglich definiert haben. Mitstatic
, es ist das, von dem Sie es anrufen.quelle
Beobachten Sie auch, ob Sie statische Variablen in untergeordneten Klassen aktualisieren. Ich fand dieses (etwas) unerwartete Ergebnis, bei dem Kind B Kind C aktualisiert:
Sie können das Problem beheben, indem Sie in jeder untergeordneten Klasse dieselbe Variable deklarieren. Beispiel:
quelle