Ich habe noch nie einen solchen Code gesehen:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
Ist es das gleiche wie new className()
?
BEARBEITEN
Wenn die Klasse vererbt ist, auf welche Klasse zeigt sie?
Antworten:
self
zeigt auf die Klasse, in der es geschrieben ist.Wenn sich Ihre getInstance-Methode in einem Klassennamen befindet
MyClass
, wird die folgende Zeile angezeigt :Wird das gleiche tun wie:
Bearbeiten: ein paar weitere Informationen nach den Kommentaren.
Wenn Sie zwei Klassen haben, die sich gegenseitig erweitern, haben Sie zwei Situationen:
getInstance
wird in der untergeordneten Klasse definiertgetInstance
wird in der übergeordneten Klasse definiertDie erste Situation würde so aussehen (ich habe für dieses Beispiel den gesamten nicht erforderlichen Code entfernt - Sie müssen ihn wieder hinzufügen, um das Singleton-Verhalten zu erhalten) *:
Hier erhalten Sie:
Was bedeutet
self
bedeutetMyChildClass
- dh die Klasse, in der es geschrieben ist.Für die zweite Situation würde der Code folgendermaßen aussehen:
Und Sie würden diese Art von Ausgabe erhalten:
Was bedeutet
self
bedeutetMyParentClass
- dh auch hier die Klasse, in der es geschrieben ist .Bei PHP <5.3 ist "die Klasse, in der es geschrieben ist" wichtig - und kann manchmal Probleme verursachen.
Aus diesem Grund führt PHP 5.3 eine neue Verwendung für das
static
Schlüsselwort ein: Es kann jetzt genau dort verwendet werden, wo wir es verwendet habenself
in diesen Beispielen verwendet haben:Aber mit
static
stattself
Sie jetzt:Was bedeutet, dass diese
static
Art von Punkten auf die Klasse die verwendet wird (wir haben verwendetMyChildClass::getInstance()
), und nicht auf die, in der sie geschrieben ist.Natürlich ist das Verhalten von
self
nicht geändert, um vorhandene Anwendungen nicht zu beschädigen - PHP 5.3 hat gerade ein neues Verhalten hinzugefügt, das das recyceltstatic
Schlüsselwort recycelt.Wenn Sie über PHP 5.3 sprechen, sollten Sie einen Blick auf die Seite Late Static Bindings des PHP-Handbuchs werfen .
quelle
baseclass
, wenn es gibt , aufclass
welches zeigt es?self
und Vererbung zu geben. und ich habe auch einige Informationen überstatic
in PHP 5.3 aufgenommen ;; hoffe das hilft :-)Dies scheint eine Implementierung des Singleton-Musters zu sein . Die Funktion wird statisch aufgerufen und prüft, ob die statische Klasse die Variable hat
$_instance
gesetzt ist.Ist dies nicht der Fall, initialisiert es eine Instanz von sich selbst (
new self()
) und speichert sie in$_instance
.Wenn Sie anrufen, erhalten
className::getInstance()
Sie ein und dasselbe bei jedem Aufruf Klasseninstanz. Dies ist der Punkt des Singleton-Musters.Ich habe es jedoch noch nie so gesehen und wusste ehrlich gesagt nicht, dass es möglich ist. Was ist
$_instance
in der Klasse deklariert?quelle
$_instance
wird erklärt alspublic static $_instance;
Dies wird höchstwahrscheinlich in Singleton-Entwurfsmustern verwendet, bei denen der Konstruktor als privat definiert ist, um eine Instanziierung zu vermeiden. Der Doppelpunktoperator
(::)
kann auf Elemente zugreifen, die innerhalb der Klasse als statisch deklariert sind. Wenn also statische Elemente vorhanden sind, die Pseudovariable $ Dies kann nicht verwendet werden, daher wird der Code selbst verwendet. Singletons sind gute Programmierpraktiken, die nur eine Instanz eines Objekts wie Datenbank-Connector-Handler zulassen. Der Zugriff auf diese Instanz erfolgt über den Clientcode, indem ein einzelner Zugriffspunkt erstellt wird. In diesem Fall hat er ihn benanntgetInstance()
. Die getInstance an sich war die Funktion, mit der das Objekt im Wesentlichen mit dem neuen Schlüsselwort erstellt wurde, um ein Objekt zu erstellen, dh die Konstruktormethode auch genannt.Die Zeile
if(!isset(self::instance))
prüft, ob bereits ein Objekt erstellt wurde. Sie konnten dies nicht verstehen, da der Code nur ein Fragment ist. Irgendwo oben sollten statische Elemente vorhanden sein, wie wahrscheinlichIn normalen Klassen hätten wir einfach auf dieses Mitglied zugegriffen
aber es ist statisch deklariert und so konnten wir den $ this-Code nicht verwenden, den wir stattdessen verwenden
Durch Überprüfen, ob in dieser statischen Klassenvariablen ein Objekt gespeichert ist, kann die Klasse entscheiden, ob eine einzelne Instanz erstellt werden soll oder nicht. Wenn sie also nicht gesetzt ist, gibt es kein Objekt auf dem statischen Element $ _instance an Es generiert ein neues Objekt und speichert es
$_instance
mit dem Befehl im statischen Elementund gab es an den Client-Code zurück. Der Client-Code kann dann problemlos die einzelne Instanz des Objekts mit seinen öffentlichen Methoden verwenden, aber im Client-Code, der den einzelnen Zugriffspunkt aufruft, dh die
getInstance()
Methode ist auch schwierig, muss sie so aufgerufen werdenAus diesem Grund wird die Funktion an sich als statisch deklariert.
quelle
Ja, es ist wie
new className()
(bezogen auf die Klasse, die diese Methode enthält), wahrscheinlich in einem Singleton-Muster verwendet, in dem der Konstruktor privat ist.quelle
Wenn die Klasse geerbt wird, erhalten Sie durch Aufrufen von getInstance () von child keine Instanz von child. Es wird nur eine Instanz der übergeordneten Instanz zurückgegeben. Dies liegt daran, dass wir neues Selbst () nennen.
Wenn Sie möchten, dass die untergeordnete Klasse eine Instanz der untergeordneten Klasse zurückgibt, verwenden Sie new static () in getInstance () und geben Sie dann die untergeordnete Klasseninstanz zurück. Dies nennt man späte Bindung !!
quelle