Clases y Objetos
PHP Manual

Métodos Magicos

Las siguientes funciones de clases en PHP son mágicas: __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state y __clone. No se pueden definir estas funciones en ninguna clase, salvo que se desee utilizar la funcionalidad asociada a ellas.

Caution

PHP reserva todos los nombres de función que comienzan con __ como mágicas. Se recomienda no utilizar nombres de funciones que comiencen con __, salvo que se desee algunas de las funcionalidades mágicas documentadas

__sleep y __wakeup

la función serialize() comprueba si la clase tiene una función con el nombre mágico __sleep. En tal caso, se ejecuta esta función antes de llevar a cabo la serialización. Puede limpiar un objeto, y se espera que devuelva un array que contenga los nombres de las variables del objeto que se deben serializar. Si el método no devuelve nada, entonces se serializa NULL y se emite E_NOTICE.

Note:

Para __sleep no es posible devolver nombres de propiedades privadas en las clases padre. Esto resultaría un nivel de error E_NOTICE. En su lugar, se debe utilizar la interfaz Serializable.

El uso para el que está destinado __sleep consiste en finalizar procesos o llevar a cabo tareas similares. Además, la función también es útil si se tiene un gran número de objetos que no se necesitan almacenar por completo.

Por otra parte, unserialize() comprueba si existe una función con el nomre mágico __wakeup. Si estuviera presente, esta función podría reconstruir cualquier recurso que tuviera el objeto.

El uso para el que __wakeup está destinado, es reestablecer cualquier conexión con base de datos que se haya perdido durante la serialización, y para llevar a cabo otras reinicializaciones.

Example #1 Sleep y 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();
    }
}
?>

__toString

El método __toString le permite a una clase decidir cómo comportarse cuando se le trate como a un string. Por ejemplo, lo que echo $obj; mostraría. Este método debe devolver un string, dado que si no, se emitirá un nivel de error fatal E_RECOVERABLE_ERROR.

Example #2 Ejemplo básico

<?php
// Declaramos una clase básica
class TestClass
{
    public 
$foo;

    public function 
__construct($foo)
    {
        
$this->foo $foo;
    }

    public function 
__toString()
    {
        return 
$this->foo;
    }
}

$class = new TestClass('Hola');
echo 
$class;
?>

El resultado del ejemplo sería:

Hola

Antes de PHP 5.2.0, sólo se invocaba al método __toString cuando se combinaba directamente con echo() o con print(). Desde PHP 5.2.0, se le llama en todos los contextos de strings (p.ej. en printf() con el modificador %s) pero no en contextos de otro tipo (p.ej. con el modificador %d). Desde PHP 5.2.0, convertir objetos a string sin el método __toString emitirá un E_RECOVERABLE_ERROR.

__invoke

Al método __invoke se le llama cuando un script trata de llamar a un objeto como si fuera una función.

Note:

Esta funcionalidad está disponible desde PHP 5.3.0.

Example #3 Uso de __invoke

<?php
class CallableClass
{
    public function 
__invoke($x)
    {
        
var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

El resultado del ejemplo sería:

int(5)
bool(true)

__set_state

A este método static se le llama para las clases exportadas por var_export(), desde PHP 5.1.0.

El único parámetro de este método es un array que contenga las propiedades exportadas en la forma array('propiedad' => valor, ...).

Example #4 Uso d __set_state (desde PHP 5.1.0)

<?php

class A
{
    public 
$var1;
    public 
$var2;

    public static function 
__set_state($an_array// Desde PHP 5.1.0
    
{
        
$obj = new A;
        
$obj->var1 $an_array['var1'];
        
$obj->var2 $an_array['var2'];
        return 
$obj;
    }
}

$a = new A;
$a->var1 5;
$a->var2 'foo';

eval(
'$b = ' var_export($atrue) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);

?>

El resultado del ejemplo sería:

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Clases y Objetos
PHP Manual