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
?>


