Anteriormente ya había hablado de la programación orientada a objetos en PHP4, ahora vamos a ir complementado con la serialización de clases.
En PHP las clases se pueden serializar en una cadena de datos mediante la función serialize de PHP, la cual convierte los datos de nuestra clase en una cadena de valores.
Así mismo las clases serializadas se pueden volver a recuperar con la función unserialize devolviendo los valores de la clase otra vez a la misma para recuperar su estado.
Hasta aquí todo bien, pero que pasa si queremos realizar alguna función extra, o por ejemplo que nuestra clase se conecte con una base de datos y queramos restaurar el recurso de la conexión, ya que aunque tengamos la variable que indica el recurso del enlace de conexión este no seguirá activo. Pues bien, que no cunda el pánico, ya que hay unas funciones “mágicas” para ello en PHP que nos permiten hacer operaciones antes de serializar y después de serializar, con las que podemos guardar información a las variables globales y preparar nuestra clase para serializarse con todos los parámetros que necesitemos, y para después volver a restaurar correctamente la clase.
Antes de serializar usando la clase con serialize, si se trata de una clase, PHP llamara a la función mágica __sleep() de nuestra clase (que nosotros crearemos), en ella haremos todas las operaciones que necesitemos grabando los datos en variables de la clase, y posteriormente se serializara dicha clase.
Por el contrario al restaurar la clase con unserialize, este restaurara primero los valores de las variables y procederá a llamar (si existe) a la función __wakeup() para que realice el proceso que se requiera para la restauración de la clase.
Un ejemplo de una clase de conexión serializable.
class Connection {
var $link;
var $server;
var $username;
var $password;
var $db;
public function Connection($server, $username, $password, $db){
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect(){
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep(){
mysql_close($this->link);
}
public function __wakeup(){
$this->connect();
}
}
Un ejemplo de la serialización y guardado en un archivo de una clase
// Creamos nuestra clase de conexion
$con = new Conexion("localhost","root","root","test");
// Serializamos nuestra clase
$miClaseparaGuardar = serialize($con);
// guardamos en un archivo la clase
$gestor = fopen("clase.txt", 'a'));
fwrite($gestor, $miClaseparaGuardar );
fclose($gestor);
Y un ejemplo de como recuperamos la clase anteriormente serializada
// Recuperamos los datos de la clase
$gestor = fopen("clase.txt", 'r'));
$contenido = fread($gestor, filesize("clase.txt"));
fclose($gestor);
// Volvemos a su estado la clase. (debe existir la definición de la clase lógicamente xD)
$con = unserialize($con);