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 self
significa 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 self
significa 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 static
palabra clave: ahora se puede usar exactamente donde la usamos self
en esos ejemplos:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Pero, con en static
lugar de self
, ahora obtendrás:
object(MyChildClass)#1 (0) { }
Lo que significa que static
apunta a la clase que se usa (usamos MyChildClass::getInstance()
), y no a la clase en la que está escrito.
Por supuesto, el comportamiento de self
no se ha cambiado, para no romper las aplicaciones existentes - PHP 5.3 acaba de agregar un nuevo comportamiento, reciclando la static
palabra 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.