Méthodes magiques

Les noms de fonction __construct, __destruct (voir les Constructeurs et Destructeurs), __call, __get, __set (voir la surcharge), __sleep, __wakeup et __toString sont magiques dans les classes PHP. Vous ne pouvez pas utiliser ces noms de fonction dans aucune de vos classes sauf si vous voulez modifier le comportement associé à ces fonctions magiques.

Attention

PHP réserve tous les noms de fonctions commençant par __ 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.

Le but avoué de __sleep est de clore toutes les connexions aux bases de données que l'objet peut avoir, valider les données en attente ou effectuer des tâches de nettoyage. De plus, cette fonction est utile si vous avez de très gros objets qui n'ont pas besoin d'ere 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.

__toString

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

Exemple 19-26. 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 que la méthode __toString ne sera appelée que si elle est directement combinée avec echo() ou print().

Exemple 19-27. Cas où __toString est appelée

<?php
// __toString appelée
echo $class;

// __toString appelée (reste un paramètre normal pour echo)
echo 'text', $class;

// __toString non appelée (opérateur de concaténation utilisé en premier)
echo 'text' . $class;

// __toString non appelée (convertion en une chaîne de caractères en premier)
echo (string) $class;

// __toString non appelée (convertion en une chaîne de caractères en premier)
echo "text $class";
?>