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, ви можете поглянути на сторінку пізніх статичних прив’язок у посібнику PHP.