37 votes

Mes fonctions PHP doivent-elles accepter un tableau d'arguments ou dois-je demander explicitement des arguments ?

Dans une application web PHP sur laquelle je travaille, je vois des fonctions définies de deux manières différentes.

Approche 1 :

function myfunc($arg1, $arg2, $arg3)

Approche 2 :

// where $array_params has the structure array('arg1'=>$val1, 'arg2'=>$val2, 'arg3'=>$val3)
function myfunc($array_params)

Quand dois-je utiliser une approche plutôt qu'une autre ? Il semble que si les exigences du système ne cessent de changer, et donc que le nombre d'arguments pour myfunc ne cesse de changer, l'approche 1 peut nécessiter beaucoup de maintenance.

30voto

middaparka Points 33832

Si le système change si souvent que l'utilisation d'un tableau indexé est la meilleure solution, je dirais que c'est le dernier de vos soucis :-)

En général, les fonctions/méthodes ne devraient pas prendre trop d'arguments (5 plus ou moins 2 étant le maximum) et je dirais que vous devriez vous en tenir à l'utilisation de fonctions nommées (et idéalement de type suggéré ) arguments. (Un tableau indexé d'arguments n'a vraiment de sens que s'il y a une grande quantité de données optionnelles - un bon exemple étant les informations de configuration).

Comme le dit @Pekka, le passage d'un tableau d'arguments est également susceptible d'être une douleur à documenter et donc à maintenir pour d'autres personnes/vous-mêmes dans 'n' mois.

Mise à jour-ette...

Par ailleurs, le livre souvent mentionné Code complet examine ces questions de manière assez détaillée - c'est un excellent ouvrage que je recommande vivement.

17voto

Pekka 웃 Points 249607

L'utilisation d'un tableau de paramètres (un substitut de ce que l'on appelle "arguments nommés" dans d'autres langages) est très bien - j'aime l'utiliser moi-même - mais elle a un gros inconvénient : Les arguments ne sont pas documentables en utilisant la notation standard phpDoc de cette façon, et par conséquent, votre IDE ne sera pas en mesure de vous donner des indications lorsque vous tapez le nom d'une fonction ou d'une méthode.

13voto

Bryan M. Points 9403

Je trouve que l'utilisation d'un en option d'arguments pour être utile lorsque je veux remplacer un ensemble de valeurs par défaut dans la fonction. Cela peut être utile pour construire un objet qui a beaucoup d'options de configuration différentes ou qui est juste un conteneur d'informations. C'est quelque chose que j'ai appris principalement dans le monde Ruby.

Par exemple, si je veux configurer un conteneur pour une vidéo dans ma page Web :

function buildVideoPlayer($file, $options = array())
{
  $defaults = array(
    'showAds' => true,
    'allowFullScreen' = true,
    'showPlaybar' = true
  );

 $config = array_merge($defaults, $options);

 if ($config['showAds']) { .. }
}

$this->buildVideoPlayer($url, array('showAds' => false));

Notez que la valeur initiale de $options est un tableau vide, et qu'il est donc facultatif de le fournir.

De plus, avec cette méthode, nous savons que $options sera toujours un tableau, et nous savons que ces clés ont des valeurs par défaut, donc nous n'avons pas constamment besoin de vérifier is_array() o isset() lors de la référence à l'argument.

5voto

Avec la première approche, vous obligez les utilisateurs de votre fonction à fournir tous les paramètres nécessaires. Avec la deuxième approche, vous ne pouvez pas être sûr d'avoir obtenu tout ce dont vous avez besoin. Je préfère la première approche.

4voto

Si les paramètres que vous passez peuvent être regroupés logiquement, vous pouvez envisager d'utiliser un objet paramètre ( Refactoring Martin Fowler, p. 295). Ainsi, si vous devez ajouter d'autres paramètres, il vous suffit d'ajouter des champs supplémentaires à votre classe de paramètres et les méthodes existantes ne seront pas interrompues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X