Manuel PHP
Précédent | Chapitre 19. Les classes et les objets (PHP 5) | Suivant

# Surcharge

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. Toutes les méthodes surchargées doivent être définies en tant que static. En PHP 5.0.x, toutes les méthodes surchargées doivent être définies en tant que public.

Depuis PHP 5.1.0, il est également possible de surcharger les fonctions isset() et unset() via, respectivement, les méthodes __isset et __unset.

## Surcharge de membre

void __set ( string name, mixed value )
mixed __get ( string name )
bool __isset ( string name )
void __unset ( string 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-20. Exemple de surcharge avec __get, __set, __isset et __unset

`<?php
class Setter
{
public $n;
private $x = array("a" => 1, "b" => 2, "c" => 3);
private function __get($nm)
{
echo "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";
}
}
private function __set($nm, $val)
{
echo "Définition de [$nm] à $val\n";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
echo "OK!\n";
} else {
echo "Pas OK!\n";
}
}
private function __isset($nm)
{
echo "Vérifie si $nm est défini\n";
return isset($this->x[$nm]);
}
private function __unset($nm)
{
echo "Libération de $nm\n";
unset($this->x[$nm]);
}
}
$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
var_dump(isset($foo->a)); //true
unset($foo->a);
var_dump(isset($foo->a)); //false
// ceci ne passera pas via la méthode __isset()
// parce que 'n' est une propriété publique
var_dump(isset($foo->n));
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!

    Vérifie si a est défini
    bool(true)
    Libération de a
    Vérifie si a est défini
    bool(false)
    bool(true)

    object(Setter)#1 (2) {
      ["n"]=>
      int(1)
      ["x:private"]=>
      array(2) {
        ["b"]=>
        int(2)
        ["c"]=>
        int(3)
      }
    }

## Surcharge de méthode

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-21. Exemple de surcharge avec __call

`<?php class Caller { private $x = array(1, 2, 3); private 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) }`

Précédent | Sommaire | Suivant
Interfaces | Niveau supérieur | Parcours d'objets