metodos - Uso de los Métodos Mágicos de PHP__sueño y__superiencia
php<__ invoke (4)
Como ya se describió, se llama a __sleep()
cuando serialize()
un objeto y __wakeup()
después de unserialize()
.
La serialización se usa para conservar objetos: obtendrá una representación de un objeto como una cadena que luego se puede almacenar en $_SESSION
, una base de datos, cookies o cualquier otro lugar que desee.
Valores de recursos
Sin embargo, serialize()
no puede serializar (es decir, transformar en una representación textual) el valor del tipo de recurso . Esta es la razón por la que todos estos valores desaparecerán después de unserialize()
ingerirlo.
Gráfico de objetos
o miembros, y los miembros de los miembros y el ... ad infinitum
Otro punto, quizás más importante, es que serialize()
atravesará todo el gráfico de objetos de $obj
si lo serializa. Esto es excelente cuando lo necesita, pero si solo necesita partes del objeto y ciertos objetos vinculados son "específicos del tiempo de ejecución" y se comparten entre muchos objetos pero también por otros objetos, es posible que no desee ese comportamiento.
PHP maneja gráficas cíclicas correctamente! Significado: Si (un miembro de) $ a se vincula a $ b, y $ b se vincula a $ a se maneja correctamente, sin embargo, en muchos niveles.
Ejemplo: objetos específicos de sesión (compartidos)
Por ejemplo, $obj->db
hace referencia a un objeto de la $database
$obj->db
, pero también a otros objetos. $obj->db
sean los mismos objetos, después de unserialize()
ing, que tienen todos los demás objetos en su próxima sesión, no una instancia aislada del objeto de la base de datos.
En este caso, tendría un método __sleep()
como este:
/**
/* DB instance will be replaced with the one from the current session once unserialized()
*/
public function __sleep() {
unset($this->db);
}
y luego restaurarlo de esta manera:
public function __wakeup() {
$this->db = <acquire this session''s db object>
}
Otra posibilidad es que el objeto sea parte de alguna estructura de datos (global) donde se deba registrar. Usted podría hacer esto manualmente, por supuesto:
$obj = unserialize($serialized_obj);
Thing::register($obj);
Sin embargo, si es parte del contrato de objetos que debe estar en ese registro, no es una buena idea dejar esta llamada mágica al usuario de su objeto. La solución ideal es, si el objeto se preocupa por sus responsabilidades, es decir, estar registrado en Thing
. Eso es lo que __wakeup()
permite hacer de manera transparente (es decir, ya no necesita preocuparse por esa dependencia mágica) de su cliente.
De manera similar, puede usar __sleep()
para " __sleep()
registro" de un objeto si es apropiado. (Los objetos no se destruyen cuando se serializan, pero puede tener sentido en su contexto).
Cierres
Por último, pero no menos importante, los cierres tampoco admiten la serialización. Esto significa que tendrá que volver a crear todos los cierres adjuntos en __wakeup()
.
¿Cuál es el uso de los métodos mágicos __sleep
y __wakeup
en PHP? Leí la documentación de PHP pero aún no está claro:
class sleepWakeup {
public function __construct() {
// constructor //
}
public function __sleep() {
echo ''Time to sleep.'';
}
public function __wakeup() {
echo ''Time to wakeup.'';
}
}
$ob = new sleepWakeup();
// call __sleep method
echo $ob->__sleep();
echo "/n";
// call __wakeup method
echo $ob->__wakeup();
Este código de ejemplo se imprime:
Time to sleep.
Time to wakeup.
Si __sleep
cambiar el nombre de __sleep
y __wakeup
a foo
y bar
entonces hace lo mismo. ¿Cuál es el uso adecuado de estos dos métodos?
Estos métodos se utilizan al llamar a serialize () y unserialize () en los objetos para asegurarse de que tiene un gancho para eliminar algunas propiedades como las conexiones de base de datos y restablecerlas al cargar. Esto sucede cuando se almacenan objetos en sesiones entre otras cosas.
Son muy parecidas a las funciones de gancho, que podemos usar de acuerdo con nuestras necesidades. Se me ocurrió este simple ejemplo en tiempo real. Ahora intenta ejecutar este código en dos escenarios:
class demoSleepWakeup {
public $resourceM;
public $arrayM;
public function __construct() {
$this->resourceM = fopen("demo.txt", "w");
$this->arrayM = array(1, 2, 3, 4); // Enter code here
}
public function __sleep() {
return array(''arrayM'');
}
public function __wakeup() {
$this->resourceM = fopen("demo.txt", "w");
}
}
$obj = new demoSleepWakeup();
$serializedStr = serialize($obj);
var_dump($obj);
var_dump($serializedStr);
var_dump(unserialize($serializedStr));
Escenario 1:
Primero comentando los __sleep()
y __wakeup()
, verifique la salida. Encontrará que falta el recurso cuando lo deserialice.
Escenario 2:
Ahora intente ejecutarlo sin comentarlos, descubrirá que el objeto volcado primero y último var_dump
sería el mismo.
prueba esto
<?php
$ob = new sleepWakeup();
$safe_me = serialize($ob);
$ob = unserialize($safe_me);
?>