Logique de conception et possibilités des arguments (nommés).
Quand on code une fonction, on a tendance à la coder « du haut vers le bas », je propose ici de fonctionner différemment pour se poser les bonnes questions au bon moment et bien organiser sa réflexion et son développement :
L’idée est donc de coder « le début », « la fin » et de finir par le « milieu ».
Avec PHP 8 et les paramètres nommés (point suivant), cette méthode peut être obsolète.
Imaginons que j’ai besoin de créer une fonction pour construire une balise HTML <input … />. Les possibilités de personnalisation sont nombreuses : type, value, placeholder, etc.
Je peux donc créer une fonction qui aura autant de paramètres que de possibilités de personnalisation :
function input(string $name, string $type = 'text', string $value = '', string $placeholder = '', string $id = '', bool $required = false): string
{
// Détails de ma fonction
}
// Je peux l'appeler de cette façon :
echo input('prenom');
echo input('age', 'number');
// Mais si je ne veux paramétrer que le placeholder, je me retrouve avec :
echo input('prenom', 'text', '', 'Entrez votre prénom');
// Ou si je veux que l'âge soit obligatoire :
echo input('age', 'number', '', '', '', true);
On voit dans les 2 derniers exemples que la lisibilité de l’appel de la fonction n’est pas optimale. Si je devine à quoi correspondent les 2 premiers paramètres, les 3 suivants sont tous à ‘ ‘ et donc difficiles à comprendre. Même le true à la fin n’est pas intuitif.
L’idée est donc de limiter le nombre de paramètres à seulement ceux qui sont obligatoires et d’avoir un paramètre $options :
function input(string $name, array $options = []): string
{
// Traitement de la value
if (isset($options['value'])) {
// Prise en considération de cette option
}
// Valeur par défaut pour le type
$type = $options['type'] ?? 'text';
// ...
}
// Lors de l'appel de ma fonction, en reprenant les exemples précédents, j'aurais donc :
echo input('prenom');
echo input('age', ['type' => 'number']);
echo input('prenom', ['placeholder' => 'Entre votre prénom']);
echo input('age', ['type' => 'number', 'required' => true]);
Les appels des fonctions sont donc ici beaucoup plus lisibles et compréhensibles. Il n’y a aucune interprétation possible sur les options qui sont gérées et pas besoin de retenir dans quel ordre les paramètres ont été indiqués dans la déclaration de la fonction.
Le code précédent est un bon exemple pour illustrer les paramètres nommés.
On garde la première déclaration de fonction, avec tous les paramètres :
function input(
string $name,
string $type = 'text',
string $value = '',
string $placeholder = '',
string $id = '',
bool $required = false
): string
{
// Détails de ma fonction
}
Mais les appels sont cette fois différents :
echo input(name: 'prenom', placeholder: 'Entre votre prénom');
echo input(name: 'age', type: 'number', required: true]);
L’ordre d’appel n’a plus d’importance. Ce sont les noms qui vont s’occuper des correspondances.
PHP 8 : named arguments (en anglais)
Corrigés, challenges, actualités, veille technique... aucun spam.