J'ai déjà eu ce genre de débat philosophique avec moi-même. Voici où j'en suis la plupart du temps, bien que je réalise que c'est une réponse basée sur l'opinion:
Une chose que je vois qui pourrait aider à répondre à la question est le passage de $ params qui peut ou non avoir des attributs / membres de tableau qui sont définis.
Au fil des ans, je suis arrivé à cette conclusion:
Évitez le passage de tableaux.
Pourquoi? Eh bien, il n'y a aucun moyen de définir ou de définir des valeurs sentinelles pour les arguments passés facultatifs.
En d'autres termes, avec le code que vous avez spécifié, vous ne pouvez pas faire quelque chose comme ceci:
function __construct($arg1 = NULL, $arg2 = DEFAULT_VAL) {
$this->arg1 = $arg1;
$this->arg2 = $arg2;
}
$ arg1 et $ arg2 sont des arguments facultatifs - s'ils ne sont pas transmis, ils ont respectivement NULL et DEFAULT_VAL - pas besoin de vérifier explicitement.
Peut-être que cela semble un peu arbitraire.
Je pense que j'obtiens ce que vous essayez d'accomplir - le passage d'une seule référence par opposition à des tonnes d'arguments. Cela m'amène à ma prochaine conclusion:
Si vous ne passez pas de variables "atomiques" (chaînes, entiers, littéraux), passez des objets.
Il y a des avantages de performances ici car le passage d'objets se fait par référence (bien que les tableaux soient à peu près les mêmes à l'intérieur de PHP).
Vous pourriez donc faire quelque chose comme:
function __construct(MyAwesomeObject $oArg) {
$this->oArg = $oArg;
}
L'argument d'objet passé serait alors garanti d'avoir "property1", "property2" bien qu'avec éventuellement des valeurs par défaut elles-mêmes.
De plus, ici, vous pouvez taper hint et un bon IDE suggérera correctement l'achèvement du code.
Mais nous réalisons rapidement que nous avons un poulet et un œuf en cours: vous construisez un objet avec des arguments d'objet passés qui eux-mêmes doivent être construits à un moment donné.
Alors, où cela nous mène-t-il? Eh bien, je suis arrivé à la conclusion que toutes les classes finissent par se résumer à, faute d'un meilleur terme, des variables "atomiques" (chaînes, flottants, doubles, entiers, ressources que vous comprenez), et que j'ai tendance à essayer pour construire toutes les classes avec ces types ou objets variables - mais pas les tableaux.
Alors ai-je répondu à votre question? probablement pas exactement. Mais j'espère avoir illustré quelque chose d'utile, quoique quelque peu stylistique. Je pense que le code est un peu plus propre, plus lisible et moins coûteux.
Maintenant, cela ne veut pas dire que vous ne devriez pas nettoyer votre entrée. C'est une autre discussion entièrement.
J'espère que cela t'aides.
new object($param1,-some default value so I can specify the next parameter-, $param3);
et vous avez donc vos valeurs par défaut codées en dur à plusieurs endroits différentsBien que j'ai tendance à éviter de transmettre des tableaux à un constructeur, je trouve parfois nécessaire de traiter une valeur de tableau entrante (comme pour une classe qui lit les valeurs d'un fichier de configuration).
Dans un cas comme celui-ci, je profiterai des fonctions de tableau de PHP pour m'assurer que je travaille exactement avec ce avec quoi je pense travailler:
Cette dernière ligne utilise
array_merge()
pour écraser toutes les valeurs$defaults
avec leurs valeurs correspondantes de$incoming
. J'utilise égalementarray_intersect_key()
pour m'assurer que le tableau résultant ne contient aucune clé supplémentaire que la classe / méthode ne saurait pas traiter.la source
array_merge_recursive
.