La surcharge des méthodes peut s'opérer par l'intermédiaire de la méthode __call(). Cette surcharge consiste à utiliser un nom de méthode identique pour des appels de méthodes avec un nombre variable d'arguments.
//Appel d'une méthode avec des signatures différentes $objet = new Objet(); $objet->calcul(10); $objet->calcul(10, 2); $objet->calcul(10, 2, puissance);
La surcharge des méthodes reflète un concept de la programmation objet. Il s'agît du polymorphisme, soit la capacité d'un objet à s'adapter aux différentes invocations possibles de méthodes avec un nom commun mais une liste d'arguments différents (signature).
Les méthodes invoquées à partir de l'objet n'existe pas dans la classe sous-jacente. La méthode __call() est chargée d'interpréter ces appels de méthodes.
class Objet { function __call($nom_methode, $arguments){ //Gestion des méthodes n'existant pas dans la classe... } }
Le paramètre $nom_methode contient le nom de la méthode qui est invoquée par l'objet. Tandis que $arguments contient la liste des arguments passés à la méthode précitée.
function __call($nom_methode, $arguments){ //$nom_methode = 'calcul'; //$arguments = array(10, 2, 'puissance'); }
Si les méthodes existent au sein de la classe, alors la fonction __call n'aura aucun effet.
class Personne { private $civilite; private $nom; private $prenom; private $adresse; private $telephone; public function __call($nom, $args) { switch ($nom) { case 'fixer': $nom = (sizeof($args) == 3) ? 'fixer_identite' : 'fixer_informations'; break; default: die('La fonction Personne::'. $nom .'() n\'est pas définie.'); } return call_user_func_array(array(&$this, $nom), $args); } public function fixer_informations() { $nb = func_num_args(); if ($nb < 2) { die('Le nombre d\'arguments fourni n\'est pas correct.'); } else if($nb == 2){ for($i = 0; $i < $nb; $i++){ switch ($i) { case 0 : $this->adresse = func_get_arg($i); break; case 1 : $this->telephone = func_get_arg($i); break; } } } else { for($i = 0; $i < $nb; $i++){ switch ($i) { case 0 : $this->civilite = func_get_arg($i); break; case 1 : $this->nom = func_get_arg($i); break; case 2 : $this->prenom = func_get_arg($i); break; case 3 : $this->adresse = func_get_arg($i); break; case 4 : $this->telephone = func_get_arg($i); break; } } return $nb; } } public function fixer_identite($civilite, $nom, $prenom){ $this->civilite = $civilite; $this->nom = $nom; $this->prenom = $prenom; } } $personne_i = new Personne; $personne_i->fixer('Monsieur', 'Hussein', 'Hanoun'); var_dump($personne_i); print('\n'); $personne_i->fixer('Bagdad Irak', '+49-89-8493070'); var_dump($personne_i); print('\n'); $personne_f = new Personne; $personne_f->fixer('Madame', 'Aubenas', 'Florence', '2a rue des Rosiers 75010 Paris', '0170204512'); var_dump($personne_f); print('\n');