self apunta a la clase en la que está escrito.
Entonces, si su método getInstance está en un nombre de clase MyClass, la siguiente línea:
self::$_instance = new self();
Hará lo mismo que:
self::$_instance = new MyClass();
Editar: un par de informaciones más, después de los comentarios.
Si tienes dos clases que se extienden entre sí, tienes dos situaciones:
getInstance está definido en la clase secundaria
getInstance está definido en la clase padre
La primera situación se vería así (eliminé todo el código no necesario, para este ejemplo, tendrá que volver a agregarlo para obtener el comportamiento singleton) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Aquí obtendrás:
object(MyChildClass)#1 (0) { }
Lo que significa selfsignifica MyChildClass, es decir, la clase en la que está escrito.
Para la segunda situación, el código se vería así:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Y obtendría este tipo de resultado:
object(MyParentClass)#1 (0) { }
Lo que significa selfsignifica MyParentClass, es decir, aquí también, la clase en la que está escrito .
Con PHP <5.3, esa "clase en la que está escrito" es importante y, a veces, puede causar problemas.
Es por eso que PHP 5.3 introduce un nuevo uso para la staticpalabra clave: ahora se puede usar exactamente donde la usamos selfen esos ejemplos:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Pero, con en staticlugar de self, ahora obtendrás:
object(MyChildClass)#1 (0) { }
Lo que significa que staticapunta a la clase que se usa (usamos MyChildClass::getInstance()), y no a la clase en la que está escrito.
Por supuesto, el comportamiento de selfno se ha cambiado, para no romper las aplicaciones existentes - PHP 5.3 acaba de agregar un nuevo comportamiento, reciclando la staticpalabra clave.
Y, hablando de PHP 5.3, es posible que desee echar un vistazo a la página Late Static Bindings del manual de PHP.