self
apunta a la clase en la que está escrito.
tanto, si su método getInstance está en un nombre de clase MyClass
, la siguiente línea:
self::$_instance = new self();
va a hacer lo mismo que:
self::$_instance = new MyClass();
Editar: un par de informaciones más, después de la comunicación ents.
Si tiene dos clases que se extienden entre sí, que tienen dos situaciones:
getInstance
se define en la clase hija
getInstance
se define en la clase padre
El La primera situación se vería así (he eliminado todo el código no necesario, para este ejemplo, tendrás 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í, usted obtendrá:
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 que le obtener este tipo de salida:
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, que "la clase en la que está escrito" es importante - y, a veces puede causar problemas.
Por eso PHP 5.3 introduce un nuevo uso de la palabra clave static
: ahora se puede utilizar exactamente donde se utilizó self
en estos ejemplos:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Pero, con static
en lugar de self
, podrás ahora llegar:
object(MyChildClass)#1 (0) { }
lo que significa que static
tipo de puntos de la clase que se utiliza (que utiliza MyChildClass::getInstance()
), y no aquel en el que está escrito.
Por supuesto, el comportamiento de self
no se ha modificado para no interrumpir las aplicaciones existentes: PHP 5.3 acaba de agregar un nuevo comportamiento, reciclando la palabra clave static
.
Y, hablando de PHP 5.3, es posible que desee echar un vistazo a la página Late Static Bindings del manual de PHP.
http://stackoverflow.com/questions/151969/php-self-vs-this –
@ stereofrog, ¿quieres decir que el patrón singleton debe abandonarse? Pero todo existe por una razón, ¿verdad? – user198729
Oh, tiendo a estar de acuerdo con este punto: singleton debe ser reemplazado por fábrica – user198729