PHP : Connaitre le nombre d’arguments d'une méthode
Par Méthylbro le jeudi 24 juin 2010, 13:15 - Développement - Lien permanent
Je suis certain qu’il vous ai déjà arrivé de vouloir connaitre le nombre de paramètres qu’accepte ou qu’attend une méthode ou une fonction. En voulant améliorer une petite implémentation du pattern MVC sur l’un de mes projets en ce moment, je me suis posé sérieusement cette question.
La solution se trouve en fait dans l’
Nombre de paramètres d'une fonction
Trêve de plaisanterie, rien ne vaut un bon exemple. Nous allons définir une fonction test acceptant les paramètres A et B. B étant facultatif. Puis nous l’étudieront avec la classe ReflectionFunction héritant de la classe abstraite ReflectionFunctionAbstract.
<?php
function test($a, $b=null) {}
$etude_de_ma_fonction = new ReflectionFunction('test');
echo $etude_de_ma_fonction->getNumberOfParameters(); # 2
echo $etude_de_ma_fonction->getNumberOfRequiredParameters(); # 1
?>
Voilà donc une façon élégante de connaitre le nombre d’arguments attendus ou requis pour une fonction.
Nombre de paramètres d'une méthode de classe
Dans le cas d’une méthode de classe, le principe est le même. Sauf que cette fois nous utiliserons la classe ReflectionMethod héritant elle aussi de la classe abstraite ReflectionFunctionAbstract.
<?php
class Foo {
function bar($a, $b=null) {}
}
$etude_de_ma_methode = new ReflectionMethod('Foo', 'bar');
echo $etude_de_ma_fonction->getNumberOfParameters(); # 2
echo $etude_de_ma_fonction->getNumberOfRequiredParameters(); # 1
?>
Magnifique. Dans mon cas, cette technique m’a permis d’être certain que le nombre de paramètres de ma requête correspondaient au moins au nombre d’arguments attendus par le Controller de mon pattern MVC.
Commentaires
Y'a-t-il une différence avec func_num_args et func_get_args?
@bastien : Bien évidement qu'il y a une différence, et de taille !
func_num_args() et func_get_args() ne font que t'indiquer ces informations au sein de la fonction ou de la méthode en cours d'exécution.
Or la méthode exposée ci-dessus te permet littéralement d'analyser une fonction.
Avec ReflectionFunctionAbstract::getNumberOfRequiredParameters() tu peut connaitre le nombre d'arguments requis par une fonction.
Alors que func_num_args() t'indique simplement le nombre d'arguments que tu viens de passer à la fonction.
ReflectionFunctionAbstract s'utilise n'importe ou alors que func_num_args() ne s'utilise que lors de l'exécution de ta fonction.
Donc ce n'est pas la même chose.