Top Code 2024, les challenges sont de nouveau disponibles dans les boards pour les participant(e)s => Boards

Bonnes pratiques PHP #3 construire ses fonctions et méthodes

Logique de conception et possibilités des arguments (nommés).

Étapes de conception

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 :

  1. Le mot-clé function obligatoire, c’est un bon début !
  2. Le nom de la fonction, en respectant les conventions d’écriture pour s’assurer d’une bonne compréhension de son nom. Ne sois pas avare de caractères, privilégie la lisibilité.
  3. Les paramètres. « Qu’est ce qui passe dans la fonction ? » Quelles sont les données travaillées ? De quel(s) type(s) ? Sont-elles nécessaires ? Y a-t-il des valeurs par défaut possibles ? Est-ce que je peux travailler avec un tableau d’options ? Le nommage des paramètres est aussi un point important.
  4. L’instruction return. On passe tout de suite à la fin de la fonction. Quelle est la ou les informations que je vais retourner ? De quel type ? Organisé(es) comment ?
  5. Toute la structure est prête, tu peux coder la logique de la fonction.

L’idée est donc de coder « le début », « la fin » et de finir par le « milieu ».

Limiter le nombre de paramètres et favoriser des tableaux d’options

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.

Paramètres nommés, à partir de PHP 8

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.

Va + loin

PHP 8 : named arguments (en anglais)

On continue

Bonnes pratiques PHP #4 se passer des else… et des if !


Qui a codé ce superbe contenu ?

Keep learning

Autres contenus à découvrir


Ta newsletter chaque mois

Corrigés, challenges, actualités, veille technique... aucun spam.