Nunca había visto un código como este:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
¿Es lo mismo que new className()
?
EDITAR
Si la clase es heredada, ¿a qué clase apunta?
Respuestas:
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:Hará lo mismo que:
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 secundariagetInstance
está definido en la clase padreLa 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) *:
Aquí obtendrás:
Lo que significa
self
significaMyChildClass
, es decir, la clase en la que está escrito.Para la segunda situación, el código se vería así:
Y obtendría este tipo de resultado:
Lo que significa
self
significaMyParentClass
, 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 usamosself
en esos ejemplos:Pero, con en
static
lugar deself
, ahora obtendrás:Lo que significa que
static
apunta a la clase que se usa (usamosMyChildClass::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 lastatic
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.
fuente
baseclass
,class
que uno tiene que apunte a?self
herencia; y también he incluido información sobrestatic
PHP 5.3 ;; espero que esto ayude :-)Esto parece ser una implementación del patrón Singleton . La función se llama estáticamente y comprueba si la clase estática tiene la variable
$_instance
establecida.Si no es así, inicializa una instancia de sí mismo (
new self()
) y la almacena en$_instance
.Si llama
className::getInstance()
, obtendrá una y la misma instancia de clase en cada llamada, que es el punto del patrón singleton.Sin embargo, nunca lo había visto así hecho de esta manera y, sinceramente, no sabía que fuera posible. ¿Qué se
$_instance
declara como en la clase?fuente
$_instance
se declara comopublic static $_instance;
Es muy probable que esto se use en el patrón de diseño singleton, donde el constructor se define como privado para evitar ser instanciado, el
(::)
operador de dos puntos puede acceder a los miembros que se declaran estáticos dentro de la clase, por lo que si hay miembros estáticos, la pseudo variable $ esto no se puede usar, por lo tanto, el código se usó en su lugar, los Singleton son buenas prácticas de programación que solo permitirán 1 instancia de un objeto, como los controladores de conectores de bases de datos. Desde el código del cliente, acceder a esa instancia se haría creando un único punto de acceso, en este caso lo nombrógetInstance()
, La getInstance en sí misma fue la función que creó el objeto básicamente usando la nueva palabra clave para crear un objeto, lo que significa que el método constructor fue también llamado.la línea
if(!isset(self::instance))
verifica si ya se ha creado un objeto, no podría entender esto porque el código es solo un fragmento, en algún lugar en la parte superior, debería haber miembros estáticos como probablementeen clases normales habríamos accedido a este miembro simplemente
pero está declarado estático y por eso no podemos usar el código $ this que usamos en su lugar
al verificar si hay un objeto almacenado en esta variable de clase estática, la clase puede decidir crear o no crear una sola instancia, por lo que si no está configurado,! isset, lo que significa que no existe ningún objeto en el miembro estático $ _instance, entonces genera un nuevo objeto, lo almacena en el miembro estático
$_instance
por el comandoy lo devolvió al código del cliente. El código del cliente puede usar felizmente la instancia única del objeto con sus métodos públicos, pero en el código del cliente, llamando al punto de acceso único, es decir, el
getInstance()
método también es complicado, debe llamarse así.la razón, la función en sí misma se declara estática.
fuente
Sí, es como
new className()
(refiriéndose a la clase que contiene ese método), probablemente usado en un patrón Singleton donde el constructor es privado.fuente
Si la clase se hereda, llamar a getInstance () desde niño no le dará una instancia de niño. Solo devolverá una instancia de la instancia principal. Esto se debe a que llamamos nuevo yo ().
Si desea que la clase secundaria devuelva una instancia de la clase secundaria, utilice new static () en getInstance () y luego devolverá la instancia de la clase secundaria. ¡Esto se llama enlace tardío!
fuente