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.
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($a, true) . ';'); // $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" }