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.

Surcharge de membre

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)
  }
}

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-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)
}