self
wskazuje na klasę, w której jest napisany.
Tak więc, jeśli metoda getInstance znajduje się w nazwie klasy MyClass
, następujący wiersz:
self::$_instance = new self();
Zrobi to samo, co:
self::$_instance = new MyClass();
Edycja: jeszcze kilka informacji, po komentarzach.
Jeśli masz dwie klasy, które się wzajemnie rozszerzają, masz dwie sytuacje:
getInstance
jest zdefiniowany w klasie podrzędnej
getInstance
jest zdefiniowany w klasie nadrzędnej
Pierwsza sytuacja wyglądałaby tak (usunąłem cały niepotrzebny kod, dla tego przykładu - będziesz musiał dodać go z powrotem, aby uzyskać zachowanie singletona) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Tutaj otrzymasz:
object(MyChildClass)#1 (0) { }
Co self
oznaczaMyChildClass
- czyli klasy, w którym jest napisane.
W drugiej sytuacji kod wyglądałby następująco:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Otrzymasz taki wynik:
object(MyParentClass)#1 (0) { }
Co oznacza, że self
środki MyParentClass
- czyli tu też klasa, w którym jest napisane .
W PHP <5.3, „klasa, w której jest napisane” jest ważna - i może czasami powodować problemy.
Dlatego PHP 5.3 wprowadza nowe użycie static
słowa kluczowego: może być teraz używane dokładnie tam, gdzie użyliśmy self
w tych przykładach:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Ale static
zamiast tego self
otrzymasz:
object(MyChildClass)#1 (0) { }
Co oznacza, że ten static
rodzaj wskazuje na używaną (przez nas MyChildClass::getInstance()
) klasę , a nie tę, w której jest napisane.
Oczywiście zachowanie self
nie zostało zmienione, aby nie zepsuć istniejących aplikacji - PHP 5.3 właśnie dodało nowe zachowanie, przetwarzając static
słowo kluczowe.
A mówiąc o PHP 5.3, możesz rzucić okiem na stronę Późne statyczne powiązania w podręczniku PHP.