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.
Persistiendo datos en PHP5
Published: July 16, 2008Posted in: php5
Persistiendo datos en PHP5





Con respecto a esto siempre tuve algo en la cabeza, que me llama la atención que no lo hayan implementado. Bah, creo que no se implementó.
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.
Por lo primero, capaz que agrega la variable id de sesion, y por eso no te queda igual.
Con respecto a lo segundo podes hacerlo es serializar las dos instancias, y preguntar si son iguales, no se si hay otra forma.
serializar y guardar en un archivo *NO* es una solucion escalable. de hecho el impacto que tiene sobre la aplicacion es tremendo. la demora de acceso y escritura al disco hace que con algunas conecciones concurrentes (pongamos el caso, 10.000) tu sistema de archivos implote y colapse, tu aplicacion tenga que hacer demasiadas lecturas de archivo (ni con fopen() ni con file_get_contents()).
pueden hacer sus benchmarks por si mismos y comprobar cuanto demora abrir un archivo.
la que has liado Pablo
http://www.troubleshooters.com/codecorn/php/persist.htm
@Nassty: gracias por el dato. Gracias a este dato podemos establecer que lo mejor es guardarlo en una base de datos, o una variable de sesion.
@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.
Hola Pablo! Muy lindo blog =)
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!
Pablo, por lo primero que había preguntado, no creo que tenga que ver con el session id. El session id se utiliza en el nombre del archivo de la sesión, adentro está la data de la sesión. Pero en todo caso, dentro de todas las cosas que tengo en mi sesión está el objeto (digamos en $_SESSION['user']). Cuando lo va a poner en disco, tiene que serializar el objeto. En ese momento se podría llamar al __sleep de mi clase. Creo que por el momento eso no funciona así, pero estaría bueno.
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.
Hello.
reflects the couple’s low-key approach to their royal connections.
Bye.
Hola Pablo.
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!
Gracias David.