Qué hace el nuevo yo (); significa en PHP?

Nunca he 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?

    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 tiene dos clases que se extienden entre sí, tiene dos situaciones:

    • getInstance se define en la clase infantil
    • getInstance se define en la clase principal

    La primera situación se vería así (eliminé todo el código no necesario, para este ejemplo, tendrás que volver a agregarlo para obtener el comportamiento de 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ías este tipo de resultados:

     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 en ocasiones puede causar problemas.

    Es por eso que PHP 5.3 introduce un nuevo uso para la palabra clave static : ahora se puede usar exactamente donde usamos a 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 static lugar de self , ahora obtendrás:

     object(MyChildClass)#1 (0) { } 

    Lo que significa que static tipo static apunta a la clase que se usa (usamos MyChildClass::getInstance() ), y no aquella en la que está escrito.

    Por supuesto, el comportamiento de self no se ha modificado, para no romper 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 Enlaces finales estáticos del manual de PHP.

    Esto parece ser una implementación del patrón de Singleton . La función se llama estáticamente y verifica si la clase estática tiene la variable $_instance establecida.

    Si no lo es, inicializa una instancia de sí mismo ( new self() ) y lo almacena en $_instance .

    Si llama a 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í, y sinceramente no sabía que era posible. ¿Qué es $_instance declarado como en la clase?

    Esto es lo más probable en el patrón de diseño singleton, donde el constructor se define como privado para evitar la creación de instancias, el operador de dos puntos (::) puede acceder a los miembros que están declarados estáticos dentro de la clase, por lo que si hay miembros estáticos, la pseudovariable $ this no se puede usar, por lo tanto, el código usado self en su lugar, Singletons son buenas prácticas de progtwigción que solo permitirán 1 instancia de un objeto como manejadores de conectores de bases de datos. Desde el código del cliente, acceder a esa instancia se haría creando un solo punto de acceso, en este caso lo llamó 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 que significa el El método constructor también fue llamado.

    la línea if(!isset(self::instance)) comprueba si un objeto ya se ha creado, no se puede entender esto porque el código es solo un fragmento, en algún lugar de la parte superior, debería haber miembros estáticos como probablemente

     private static $_instance = NULL; 

    en clases normales habríamos accedido a este miembro simplemente

     $this->_instance = 'something'; 

    pero se declaró estático y no pudimos usar el $ este código que usamos en su lugar

     self::$_instance 

    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á configurada,! 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 mediante el comando

     self::$_instance = new self(); 

    y lo devolvió al código del cliente. El código del cliente puede usar felizmente la única instancia del objeto con sus métodos públicos, pero en el código del cliente, llamando al único punto de acceso, es decir, el método getInstance() también es complicado, tiene que llamarse así

     $thisObject = className::getInstance(); 

    la razón, la función en sí misma se declara estática.

    Sí, es como new className() (refiriéndose a la clase que contiene ese método), probablemente utilizado en un patrón de Singleton donde el constructor es privado.

    Si la clase se hereda, al llamar a getInstance () desde el niño no se le dará una instancia de niño. Solo devolverá una instancia de instancia principal. Esto se debe a que llamamos nuevo yo ().

    Si desea que la clase secundaria devuelva una instancia de clase secundaria, utilice nueva static () en getInstance () y luego devolverá la instancia de la clase hija. ¡Esto se llama enlace tardío!