¿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?
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.
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?
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.
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.
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!!
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