July 16th, 2008 Category: php5
10 Comments »
PHP tiene el problema que sus clases no son persistentes. La persistencia es uno de las caracteristicas del POO.
Para persistir un objeto en PHP tenemos que serializarlo, para poder usar las propiedades de un objeto tal cual quedo despues de su serializacion vamos a usar la funcion serialize para serializarlo, y unserialize para restaurarlo. Tengan en cuenta que cuando serializamos un objeto no serializamos los metodos, sino los valores que adquirieron los atributos.
La idea de esto es simple, supongamos que tenemos un carrito de compras donde el usuario completa los articulos que se quiere comprar y serializamos el objetos con los articulos adquiridos. Este usuario por X motivo decide cerrar la web, y seguir navegando por otras paginas, o simplemente cerrar la conexion. Nuestra aplicacion deberia restaurar los items seleccionados por el usuario, una vez que este vuelva a loguearse en nuestro sistema. Si nosotros previamente guardamos los datos serializados, cuando el usuario se logue solo deberiamos deserializar el objeto y seguir operando con este objeto sin ningun problema.
Para ayudarnos en este trabajo tenemos dos metodos que podemos agregar a nuestra clase, __wakeup y __sleep. La primera se ejecuta cada vez que deserializamos y la otra cada vez que serializamos.
Ahora cada vez que ustedes necesiten persistir los datos que contiene un objeto, pueden serializarlo y guardar esa serializacion (es un string), en un archivo de texto, en una variable de sesion, o en la base de datos y poder pasar por diferentes instancias sin la necesidad de generar otra vez los valores para esa clase, o recurrir a la necesidad de guardar todos los parametros en una tabla.
Pesistencia de Objetos en la Wiki
Invitame una Cerverza
Comentar
10 Responses
Con respecto a lo segundo podes hacerlo es serializar las dos instancias, y preguntar si son iguales, no se si hay otra forma.
pueden hacer sus benchmarks por si mismos y comprobar cuanto demora abrir un archivo.
http://www.troubleshooters.com/codecorn/php/persist.htm
@Acido: Muy bueno el documento ;)
@Otros: Gracias por generar un link a este blog y este post en particular desde el blog Critica de la internet, gracias a eso el blog subio 3 ptos en el page Rank ;)
@Todos: Edite el post para agregar un link a la wikipedia donde habla de la persistencia de objetos.
La persistencia no solo es una característica muy interesante que tiene PHP5 mediante las funciones __wakeup y __sleep (tal como vos las dijiste), sino también algo muy deseable de cualquier otro lenguaje de programación orientado a objetos.
Tenemos muchos objetitos dando vueltas por el universo de objetos, y en algún momento nos gustaría poder persistirlos.
El tema es que la persistencia en si no es algo TAN importante para la POO. Es lindo tenerlo como parte del lenguaje, si, pero hay cosas más importantes como son el polimorfismo y la abstracción que hacen realmente al meollo del asunto de la POO.
Lo que intento decir es que si no hay "persistencia" dentro del lenguaje de programación que uses, siempre está la opción de implementarlo vos mismo manualmente mediante algún método "guardar()". Y no por eso el lenguaje va a ser "menos orientado a objetos" que otro.
Saludos!
Con respecto a lo segundo, se pueden comparar objetos: http://ar.php.net/manual/en/language.oop5.object-comparison.php
El tema es que yo quisiera un método mágico adicional que me sirva para decirle cómo compararlos: qué propiedades tomar en cuenta, cómo comparar las propiedades, etc., etc.
:) reflects the couple's low-key approach to their royal connections.
Bye.
Queria saludarte, darte las gracias por regalarnos tu tiempo y tu conocimiento.
Este comentario nada tiene que ver con el tema pero sin con los link's que apuntan a él (tu sabes a que me refiero).
No te desanimes y segui humilde, si te equivocas corregilo, si vas a corregir a alguien que sea con humildad para que no parezcas un prepotente sabelotodo.
un abrazo!



Cuando vos guardás cualquier variable en sesión PHP la serializa. De hecho, si vos vas al session dir (digamos /var/tmp), y ves los archivitos de las sesiones, adentro está toda la data serializada en un string. Ahora... por qué la serialización no es exactamente la misma que cuando llamo yo a serialize o unserialize, de manera de que cuando yo hago:
$object = new Object();
$_SESSION['object'] = $object;
se llame automáticamente a mi __sleep()
Sería mucho muy cómodo.
Y de paso, te lo comento a vos que sé que estás cerca de los amigos de Zend (?), estaría bueno que hicieran algún método mágico para comparar los objetos. Algo que haga las veces de lo que en C++ sería sobrecargar los operadores ==, !=, , etc.
Eso es todo. Muy lindo el blog, che.