Les appels de méthodes et l'accès aux membres peuvent être surchargés
via les méthodes __call(), __get()
et __set(). Ces méthodes ne seront
déclenchées que si votre objet, hérité ou non, ne contient pas
le membre ou la méthode auquel vous tentez d'accéder.
void
__set ( string name, mixed value )
mixed
__get ( mixed name )
Les membres d'une classe peuvent être surchargés afin d'exécuter un code
spécial contenu dans vos méthodes __set() et
__get().
Le paramètre $name est le nom de la variable
qui doit être définie ou recherchée.
Le paramètre $valeur de la méthode
__set() spécifie la nouvelle valeur à donner à
la variable $name.
Exemple 19-19. Exemple de surcharge avec __get et __set
<?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3);
function __get($nm) { print "Récupération de [$nm]\n";
if (isset($this->x[$nm])) { $r = $this->x[$nm]; echo "Retour : $r\n"; return $r; } else { echo "Rien!\n"; } }
function __set($nm, $val) { print "Définition de [$nm] à $val\n";
if (isset($this->x[$nm])) { $this->x[$nm] = $val; echo "OK!\n"; } else { echo "Pas OK!\n"; } } }
$foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++; var_dump($foo); ?>
|
L'exemple ci-dessus va afficher : Définition de [a] à 100
OK!
Récupération de [a]
Retour : 100
Définition de [a] à 101
OK!
Récupération de [z]
Rien!
Définition de [z] à 1
Pas OK!
object(Setter)#1 (2) {
["n"]=>
int(1)
["x:private"]=>
array(3) {
["a"]=>
int(101)
["b"]=>
int(2)
["c"]=>
int(3)
}
} |
|
mixed
__call ( string name, array arguments )
Les méthodes d'une classe peuvent être surchargées pour exécuter un code
spécial contenu dans votre méthode __call().
Le paramètre $name utilisé est le nom de la fonction
que l'on souhaite utiliser. Les arguments qui étaient passés à la fonction
sont récupérés dans un tableau contenu dans le paramètre
$arguments.
La valeur retournée par la méthode __call() sera celle
retournée au point d'appel de la méthode d'origine.
Exemple 19-20. Exemple de surcharge avec __call
<?php class Caller { private $x = array(1, 2, 3);
function __call($m, $a) { print "Méthode $m appelée :\n"; var_dump($a); return $this->x; } }
$foo = new Caller(); $a = $foo->test(1, "2", 3.4, true); var_dump($a); ?>
|
L'exemple ci-dessus va afficher :
Méthode test appelée : array(4) { [0]=> int(1) [1]=> string(1) "2" [2]=> float(3.4) [3]=> bool(true) } array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
|
|