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 self
significa 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 self
significa 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 static
palavra-chave: agora ela pode ser usada exatamente onde usamos self
nesses exemplos:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Mas, em static
vez de self
, você agora obterá:
object(MyChildClass)#1 (0) { }
O que significa que static
isso aponta para a classe que é usada (nós usamos MyChildClass::getInstance()
), e não para aquela em que está escrita.
Claro, o comportamento do self
não foi alterado, para não quebrar os aplicativos existentes - o PHP 5.3 acabou de adicionar um novo comportamento, reciclando a static
palavra - chave.
E, falando sobre PHP 5.3, você pode querer dar uma olhada na página Late Static Bindings do manual do PHP.