Qui n’a jamais voulu créer deux fonctions différentes mais avec un profil relativement proche ( même nom, mais le dernier paramètre serait un entier supplémentaire par exemple) ou alors a défini maladroitement la même fonction dans plusieurs fichiers mais décide de modifier son profil ?
Il existe pour cela plusieurs méthodes qui dépendent majoritairement de la structure que vous employez.
Appel de fonction classique
Cette solution consiste à créer une fonction sans paramètres ( ou avec uniquement les arguments communs à la fonction de base et ses éventuelles surcharges ) et d’appliquer un traitement différent en fonction du nombre d’arguments passés en paramètres grâce aux fonctions : func_get_args() et func_num_args()
Exemple de fonction à nombre d’argument variable On veut récupérer le plus grand nombre parmi les paramètres fournis à la fonction si leur nombre est pair, ou le plus petit si leur nombre est impair.
<?php
function minMaxFromValue(){
$argsCount = func_num_args();
$argsList = func_get_args();
$selected = $argsList[0];
for($i=1;$argsCount;$i++)
if( $argsCount%2==0 ?
$args[$i] > $selected :
$args[$i] < $selected )
$selected = $args[$i];
return $selected;
}
?>
On peut donc influencer le comportement d’une fonction à travers son nombre d’argument.
Une autre méthode plus simple consiste à positionner des arguments à des valeurs par défaut dans le cas où ils ne sont pas spécifiés.
Exemple de fonction à argument par défaut Un exemple sur les pizzas.
<?php
$nb_pizza = 0;
function ajouter_pizza($action = '',$nb = 1){
global $nb_pizza;
switch($action){
case 'affichage':
echo 'Nombre de pizza actuel : '.$nb_pizza.'<br>';
break;
case 'envoyer':
$nb_pizza = $nb_pizza - $nb;
echo 'Il reste encore '.$nb_pizza.' pizza(s)<br>';
break;
case '':
$nb_pizza = $nb_pizza + $nb;
break;
}
}
ajouter_pizza('',3); // ajoute 3 pizza
ajouter_pizza('affichage'); // affiche les pizzas
ajouter_pizza(); // ajoute 1 pizza ( valeur par défaut)
ajouter_pizza('affichage'); // affiche les pizzas
ajouter_pizza('envoyer', 2); // Enlève 2 pizzas et affiche le nombre restant
?>
++++
Appel de méthode d’objet
En Php5, on peut récupérer les appels de méthodes et traiter les informations d’une façon différente grâce à la méthode __call() qui s’occupera de gérer les appels aux fonctions inexistantes.
Exemple avec __call()
<?php
class Pizzeria {
private $pizzaCounter = 0;
private $pizzaStorage = array();
public function __call($name, $args) {
// Si la méthode appelée s'appelle 'modifyPizza'
if( $name == 'modifyPizza' ){
$argsCount = count( $args );
// Si il y a un argument passé à la fonction
if( $argsCount == 1 ){
// On va ajouter une pizza
return call_user_func_array(array(&$this, 'addPizza'), $args);
// Si il y'en a deux
} else if( $argsCount == 2 ){
// On va modifier le nom d'une pizza
return call_user_func_array(array(&$this, 'modifyPizzaName'), $args);
}
}
}
public function addPizza($name){
$this -> pizzaStorage[$name] = (int)$this -> pizzaStorage[$name] + 1;
}
public function modifyPizzaName($oldName, $newName){
// On récupère le nombre de pizza anciennement nommée oldName
$pizzaStock = (int)$this -> pizzaStorage[$oldName];
// On supprime l'entrée correspondante
unset($this -> pizzaStorage[$oldName]);
// On créé la nouvelle entrée
$this -> pizzaStorage[$newName] = $pizzaStock;
}
}
$pizzeria = new Pizzeria();
$pizzeria -> modifyPizza('Pizza aux 4 fromages'); // on créé un stock de 1 pour les "Pizza aux 4 fromages"
$pizzeria -> modifyPizza('Pissaadiè'); // on créé un stock de 1 pour les "Pissaadiè"
// Mais on a fait une faute on décide de changer le nom
$pizzeria -> modifyPizza('Pissaadiè', 'Pissaladière'); // on change le nom des "Pissaadiè" en "Pissaladière"
?>
Surchage de getter et setter
De la même manière il est possible de surcharger les getters et setters d’une classe par la définition des méthodes __get() et __set() qui vont automatiquement attraper les fonctions get**** et set**** si elles n’existent pas. Ensuite en jouant sur le nom de la fonction appelée ou le nombre d’argument, on peut facilement créer des profile de fonction différent.
La surcharge de méthode prend un aspect différent des autres langages et s’affiche plus comme étant une liste de méthode de substitution et non de réel surcharge.
Le gestionnaire d’erreur de PHP
Il est possible également de redéfinir un gestionnaire en php et de récupérer les erreurs liés à un appel de fonction pour effectuer un autre traitement puis de continuer le reste de l’exécution du script.
Ceci sera plus détaillé dans un article sur les gestions d’erreurs en PHP