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 selfbedeutetMyChildClass - 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 selfbedeutet 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 staticSchlü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 staticstattself Sie jetzt:
object(MyChildClass)#1 (0) { }
Was bedeutet, dass diese staticArt 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 .