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');