Los nombres de función: __construct, __destruct (see Constructores y Destructores), __call, __get, __set, __isset, __unset (see Sobrecarga), __sleep, __wakeup, __toString, __set_state, __clone y __autoload son mágicos en las clases de PHP. No puede tener funciones con esos nombres en cualquiera de sus clases a menos que se desee la funcionalidad mágica asociada con ellos.
PHP reserva todos los nombres de funciones que empiecen con __ como mágicas. Es recomendado que no use nombres de funciones con __ en PHP a menos que dese alguna mágica funcionalidad documentada.
serialize() checa si su clase tiene una función con el nombre mágico __sleep. Si es así, esa función es ejecutada antes de cualquier serialización. Esta puede limpiar el objeto y se espera que regrese una matriz con los nombres de todas las variables de ese objeto que puede ser serializadas. Si el método no regresa nada, entonces NULL, es serializada y se inicia E_NOTICE.
La intención de usar __sleep es confirmar datos pendientes, terminar de enviar cualquier dato o ejecutar tareas similares de limpieza. También, la función es útil si tiene objetos muy grandes los cuales no necesitan mantenerse completos.
Inversamente, unserialize() checa por la presencia de una función con el nombre mágico __wakeup. Si está presente, está función puede reconstruir cualquier recurso que el objeto pueda tener.
La intención de __wakeup es reestablecer cualquier conexión a base de datos que se pueda haber perdido durante la serialización y ejecutar otras tareas de reinicialización.
Example#1 Sleep and wakeup
<?php
class Connection {
protected $link;
private $server, $username, $password, $db;
public function __construct($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()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
?>
El método __toString permite a una clase decidir como actuar cuando es convertida en cadena.
Example#2 Ejemplo simple
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo) {
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class;
?>
El resultado del ejemplo seria:
Hello
No tiene otro valor que cuando el método __toString es llamado solo cuando es directamente combinado con echo() o print(). Desde PHP 5.2.0 es llamado en cualquier contexto de cadena, (ej. en printf() con el modificador %s) pero no en otro tipo de contexto (ej. con el modificador %d). Desde PHP 5.2.0, convertir objetos sin el método __toString puede causar E_RECOVERABLE_ERROR.
Este método static es llamado para clases exportadas por var_export() desde PHP 5.1.0.
El unico parametro de este método es un arreglo conteniendo las propiedades exportadas en la forma array('property' => value, ...).