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.