self aponta para a classe em que está escrito.
Portanto, se o método getInstance estiver em um nome de classe MyClass, a seguinte linha:
self::$_instance = new self();
Fará o mesmo que:
self::$_instance = new MyClass();
Edit: mais algumas informações, após os comentários.
Se você tiver duas classes que se estendem, você terá duas situações:
getInstance é definido na classe filha
getInstance é definido na classe pai
A primeira situação ficaria assim (removi todo o código não necessário, para este exemplo - você terá que adicioná-lo de volta para obter o comportamento do singleton) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Aqui, você obterá:
object(MyChildClass)#1 (0) { }
O que significa selfsignifica MyChildClass- ou seja, a classe em que está escrito.
Para a segunda situação, o código seria assim:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
E você obteria este tipo de saída:
object(MyParentClass)#1 (0) { }
O que significa selfsignifica MyParentClass- ou seja, aqui também, a classe em que está escrito .
Com o PHP <5.3, que "a classe na qual está escrito" é importante - e às vezes pode causar problemas.
É por isso que o PHP 5.3 introduz um novo uso para a staticpalavra-chave: agora ela pode ser usada exatamente onde usamos selfnesses exemplos:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Mas, em staticvez de self, você agora obterá:
object(MyChildClass)#1 (0) { }
O que significa que staticisso aponta para a classe que é usada (nós usamos MyChildClass::getInstance()), e não para aquela em que está escrita.
Claro, o comportamento do selfnão foi alterado, para não quebrar os aplicativos existentes - o PHP 5.3 acabou de adicionar um novo comportamento, reciclando a staticpalavra - chave.
E, falando sobre PHP 5.3, você pode querer dar uma olhada na página Late Static Bindings do manual do PHP.