¿Qué significa new self(); 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 hereditaria, ¿a qué clase apunta?

Author: user198729, 2010-03-07

5 answers

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

Por lo tanto, 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: {[25]]}

  • getInstance se define en la clase hija
  • getInstance se define en el padre clase

La primera situación se vería así (he eliminado todo el código no necesario, para este ejemplo'll tendrás que agregarlo de nuevo 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) { } 

Que significa self significa MyChildClass i 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) { }

Que significa self significa MyParentClass too es decir, aquí también, la clase en la que está escrito.




Con PHP

Es por eso que PHP 5.3 introduce un nuevo uso para la palabra clave static: 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 self, ahora obtendrás:

object(MyChildClass)#1 (0) { } 

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

Por supuesto, el comportamiento de self no ha sido cambiado, para no romper las aplicaciones existentes PHP 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 estáticos tardíos del manual de PHP.

 177
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-16 10:36:00

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

Si no lo es, inicializa una instancia propia (new self()) y la almacena en $_instance.

Si llamas a className::getInstance() obtendrás una y la misma instancia de clase en cada llamada, que es el punto del patrón singleton.

Nunca he visto esto hecho de esta manera, sin embargo, y honestamente no sabía era posible. ¿Qué se declara $_instance como en la clase?

 9
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 13:41:59

Esto se usa muy probablemente en el patrón de diseño de singleton, en el que 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 this esto no se puede usar, por lo tanto, el código utilizado self 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 base de datos. Desde el código del cliente, accediendo a instance se haría creando un único 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 palabra clave new 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 un objeto ya ha sido creado, no se podí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 probablemente

private static $_instance = NULL; 

En condiciones normales clases que habríamos accedido a este miembro simplemente

$this->_instance = 'something';

Pero su declarado estático y por lo que no podemos utilizar el code este código que utilizamos en su lugar

self::$_instance

Al comprobar 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á establecido, !isset, significando que ningún objeto existe en el miembro estático {_instance, entonces genera un nuevo objeto, almacenado en el miembro estático $_instance por el comando

self::$_instance = new self();

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

$thisObject = className::getInstance();

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

 6
Author: flimh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-24 03:14:05

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

 1
Author: Matteo Riva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-07 13:41:40

Si la clase es heredada, llamar a getInstance() desde child no le dará una instancia de child. Solo devuelve una instancia de la instancia padre. Esto es porque llamamos a new self ().

Si desea que la clase hija devuelva una instancia de clase hija, use new static() en getInstance() y luego devolverá la instancia de clase hija. Esto se denomina enlace!!

 0
Author: kta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-27 07:20:12