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 :
self::$_instance = new self();
Wird das gleiche tun wie:
self::$_instance = new MyClass();
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 definiert
getInstance
wird in der übergeordneten Klasse definiert
Die 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) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Hier erhalten Sie:
object(MyChildClass)#1 (0) { }
Was bedeutet self
bedeutetMyChildClass
- dh die Klasse, in der es geschrieben ist.
Für die zweite Situation würde der Code folgendermaßen aussehen:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Und Sie würden diese Art von Ausgabe erhalten:
object(MyParentClass)#1 (0) { }
Was bedeutet self
bedeutet MyParentClass
- 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:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Aber mit static
stattself
Sie jetzt:
object(MyChildClass)#1 (0) { }
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 .