M�thodes magiques

Les fonctions __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state et __clone sont magiques en PHP. Vous ne pouvez pas utiliser ces noms de fonction dans vos classes, sauf si vous voulez impl�menter le comportement associ� � ces fonctions magiques.

Attention

PHP r�serve tous les noms de fonctions commen�ant par un double soulign� __ pour les fonctions magiques. Il est recommand� de ne pas utiliser de noms de fonctions commen�ant par __ sauf si vous voulez des fonctionnalit�s magiques document�es.

__sleep et __wakeup

La fonction serialize() v�rifie si votre classe a une fonction avec le nom magique __sleep. Si c'est le cas, cette fonction sera ex�cut�e avant toute lin�arisation. Elle peut nettoyer l'objet et elle est suppos�e retourner un tableau avec les noms de toutes les variables de l'objet qui doivent �tre lin�aris�es. Si la m�thode ne retourne rien, alors NULL est lin�aris� et une alerte de type E_NOTICE est �mise.

Le but avou� de __sleep est de valider des donn�es en attente ou d'effectuer les op�rations de nettoyage. De plus, cette fonction est utile si vous avez de tr�s gros objets qui n'ont pas besoin d'�tre sauvegard�s en totalit�.

R�ciproquement, la fonction unserialize() v�rifie la pr�sence d'une fonction dont le nom est le nom magique __wakeup. Si elle est pr�sente, cette fonction peut reconstruire toute ressource que l'objet poss�de.

Le but avou� de __wakeup est de r�tablir toute connexion base de donn�es qui aurait �t� perdue durant la lin�arisation et d'effectuer des t�ches de r�initialisation.

Exemple #1 Utilisation de sleep() et 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

La m�thode __toString d�termine comment la classe doit r�agir lorsqu'elle est convertie en cha�ne de caract�res.

Exemple #2 Exemple simple

<?php
// D�claration d'une classe simple
class ClasseTest
{
    public 
$foo;

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

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

$class = new ClasseTest('Bonjour');
echo 
$class;
?>

L'exemple ci-dessus va afficher :

Bonjour

Il est important de noter qu'avant PHP 5.2.0, la m�thode __toString n'�tait appel�e que si elle �tait directement combin�e avec echo() ou print(). Depuis PHP 5.2.0, il est appel� dans tous les contextes de cha�ne de caract�res (e.g. dans printf() avec le modificateur %s) mais pas dans les autres types de contextes (e.g. avec le modificateur %d). Depuis PHP 5.2.0, convertir un objet sans la m�thode __toString en cha�ne de caract�res �mettra une E_RECOVERABLE_ERROR.

__invoke

La m�thode __invoke est appel�e lorsque le script tente d'appeler un objet comme une fonction.

Note: Cette fonctionnalit� est disponible depuis PHP 5.3.0.

Exemple #3 Exemple avec __invoke

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

L'exemple ci-dessus va afficher :

int(5)
bool(true)

__set_state

Cette m�thode statique est appel�e pour les classes export�es par la fonction var_export() depuis PHP 5.1.0.

Le seul param�tre de cette m�thode est un tableau contenant les propri�t�s export�es sous la forme array('propri�t�' => valeur, ...).

Exemple #4 Utilisation de __set_state (depuis PHP 5.1.0)

<?php

class A
{
    public 
$var1;
    public 
$var2;

    public static function 
__set_state($an_array// Depuis 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);

?>

L'exemple ci-dessus va afficher :

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