Saltar al contenido

¿Qué significa new self(); significa en PHP?

Recuerda que en las ciencias un problema casi siempere puede tener diversas soluciones, por lo tanto te enseñamos lo más óptimo y eficiente.

Solución:

self apunta a la clase en la que está escrito.

Entonces, si su método getInstance está en un nombre de clase MyClassla 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 secundaria
  • getInstance se define en la clase padre

La primera situación se vería así (he eliminado todo el código innecesario, para este ejemplo, tendrá 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 medio 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 salida:

object(MyParentClass)#1 (0)  

Lo que significa self medio MyParentClass — es decir, aquí también, la clase en la que está escrito.


Con PHP < 5.3, "la 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 el static palabra clave: ahora se puede usar exactamente donde 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 static en lugar de selfahora obtendrás:

object(MyChildClass)#1 (0)   

Lo que significa que static tipo de puntos a la clase que se utiliza (nosotros usamos MyChildClass::getInstance()), y no aquel en el que está escrito.

Por supuesto, el comportamiento de self no se ha cambiado, para no dañar las aplicaciones existentes: PHP 5.3 acaba de agregar un nuevo comportamiento, reciclando el static palabra clave.

Y, hablando de PHP 5.3, es posible que desee echar un vistazo a la página de enlaces estáticos tardíos del manual de PHP.

Esto parece ser una implementación del patrón Singleton. La función se llama de forma estática y comprueba si el static la clase tiene la variable $_instance colocar.

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

si llamas className::getInstance() conseguirás una y las mismas instancia de clase en cada llamada, que es el punto del patrón singleton.

Sin embargo, nunca lo había visto hecho de esta manera y, sinceramente, no sabía que fuera posible. Qué es $_instance declarado como en la clase?

Es muy probable que esto se use en el patrón de diseño singleton, en el que el constructor se define como privado para evitar que se cree una instancia, los dos puntos dobles (::) el operador puede acceder a los miembros declarados static dentro de la clase, así que si hay static miembros, la pseudo variable $this no se puede usar, por lo tanto, el código se usó en su lugar, Singletons son buenas prácticas de programación que solo permitirán 1 instancia de un objeto como controladores de conectores de bases de datos. Desde el código del cliente, el acceso a esa instancia se haría creando un único punto de acceso, en este caso lo nombró getInstance()getInstance en sí mismo fue la función que creó el objeto básicamente usando la nueva palabra clave para crear un objeto, lo que significa que también se llamó al método constructor.

la línea if(!isset(self::instance)) comprueba 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 static a los miembros les gusta probablemente

private static $_instance = NULL; 

en clases normales habríamos accedido a este miembro simplemente

$this->_instance = 'something';

pero esta declarado static y entonces no pudimos usar el código $this que usamos en su lugar

self::$_instance

comprobando si hay un objeto almacenado en este static variable de clase, 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 la static miembro $_instancia, luego genera un nuevo objeto, lo almacena en el static miembro $_instance por el comando

self::$_instance = new self();

y 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, llamar al punto de acceso único, es decir, el getInstance() El método también es complicado, tiene que llamarse así.

$thisObject = className::getInstance();

la razón, la función en sí misma se declara static.

Si eres capaz, tienes la libertad de dejar un tutorial acerca de qué te ha gustado de esta crónica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *