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