self
указывает на класс, в котором он написан.
Итак, если ваш метод getInstance находится в имени класса MyClass
, следующая строка:
self::$_instance = new self();
Будет делать то же самое, что:
self::$_instance = new MyClass();
Изменить: еще пара информации после комментариев.
Если у вас есть два класса, которые расширяют друг друга, у вас есть две ситуации:
getInstance
определен в дочернем классе
getInstance
определен в родительском классе
Первая ситуация будет выглядеть так (я удалил весь ненужный код, для этого примера - вам придется добавить его обратно, чтобы получить одноэлементное поведение) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Здесь вы получите:
object(MyChildClass)#1 (0) { }
Это означает , self
средства MyChildClass
- то есть класс , в котором она написана.
Для второй ситуации код будет выглядеть так:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
И вы получите такой вывод:
object(MyParentClass)#1 (0) { }
Какие средства self
средства MyParentClass
- то есть здесь, класс , в котором она написана .
В PHP <5.3 важно, что «класс, в котором он написан», иногда может вызывать проблемы.
Вот почему PHP 5.3 вводит новое использование static
ключевого слова: теперь его можно использовать именно там, где мы использовали self
в этих примерах:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Но static
вместо этого self
теперь вы получите:
object(MyChildClass)#1 (0) { }
Это означает, что этот static
вид указывает на используемый класс (который мы использовали MyChildClass::getInstance()
), а не на тот, в котором он написан.
Конечно, поведение self
не было изменено, чтобы не нарушать работу существующих приложений - PHP 5.3 просто добавил новое поведение, повторяя static
ключевое слово.
И, говоря о PHP 5.3, вы можете взглянуть на страницу Late Static Bindings в руководстве по PHP.