Forum und email

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 ne doivent pas être définies en tant que static. 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. La méthode __isset est également appelée avec la fonction empty().

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.

Example#1 Exemple de surcharge avec __get, __set, __isset et __unset

<?php
class Setter 
{
  public 
$n;
  private 
$x = array("a" => 1"b" => 2"c" => 3);

  public 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";
    }
  }

  public 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";
    }
   }

  public function 
__isset($nm)
  {
    echo 
"Vérifie si $nm est défini\n";

    return isset(
$this->x[$nm]);
  }

  public function 
__unset($nm)
  {
    echo 
"Libération de $nm\n";

    unset(
$this->x[$nm]);
  }
}

$foo = new Setter();
$foo->1;
$foo->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 )

La méthode magique __call() permet la capture des appels à des méthodes inexistantes. De cette façon, __call() peut être utilisée pour implémenter un gestionnaire de méthodes défini par l'utilisateur qui dépend du nom de la méthode réellement appelée. Ceci est particulièrement pratique pour implémenter une classe proxy, par exemple. Les arguments qui sont passés à la fonction devront être définis dans un tableau via le paramètre $arguments. La valeur retournée par la méthode __call() sera retournée à la méthode appelante.

Example#2 Exemple de surcharge avec __call()

<?php
class Caller 
{
  private 
$x = array(123);

  public 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.4true);
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)
}