Forum und email

Métodos mágicos

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.

Caution

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.

__sleep y __wakeup

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();
    }
}
?>

__toString

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.

__set_state

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, ...).