Faire le quiz close

Les Fonctions en PHP 8

#1 Déclarer une fonction et l'appeler open

Une fonction est destinée à regrouper des instructions qui correspondent à un traitement. Ce traitement peut fournir un résultat. Ce résultat est retourné par la fonction. Dans un premier temps, on déclare la fonction, ensuite, on l'appelle 😎.

Ci-dessous, je fais un exemple. Pour déclarer ma fonction, je commence par utiliser le mot réservé function. Je le fais suivre du nom de la fonction. Dans mon exemple, ma fonction va calculer le produit de deux valeurs. Je vais lui donner le nom calculerProduit. Souvent, pour donner un nom à une fonction, on utilise un verbe suivi d'un nom. Le verbe pour dire ce que l'on fait, et le nom pour illustrer le verbe. Pour "l'orthographe" du nom de la fonction, aujourd'hui, on utilise le camelCase. C'est ce qui est utilisé dans les frameworks PHP, que ce soit Symfony ou Laravel.

Sur le plan pratique, il faut savoir que pour PHP, le nom de la fonction n'est pas case sensitive. Personnellement, je préfère respecter la casse. C'est ce que tout le monde fait. Je vous conseille de faire pareil.

Ensuite, je dois coder une liste de paramètres. Cette liste, je vais la mettre entre parenthèses. Ces paramètres, ce sont des variables qui recevront des valeurs, lorsque j'appellerai la fonction. Dans cet exemple, les paramètres vont être les deux variables $a et $b.

Maintenant, je vais passer au codage du corps de la fonction. Le corps de la fonction, je vais l'encapsuler dans une paire d'accolades.

Dans le corps de la fonction, je vais faire simplement un return du produit de $a par $b. Je fais le return pour retrourner une valeur.

Maintenant, je vais appeler la fonction en lui fournissant deux valeurs 2 et 3. Ces deux valeurs, ce sont les arguments qui sont passés à l'appel de la fonction.

Le plus souvent, la fonction retourne un résultat, mais ce n'est pas obligatoire. Lorsque la fonction ne retourne pas de résultat, c'est en fait une procédure. Il n'y a pas d'autre moyen de faire une procédure en PHP.

Si j'appelle la fonction avec un seul argument, le parseur le détecte et me le dit. Si vous n'avez pas intelephense, alors vous le voyez à l'exécution. Vous avez une erreur fatale Parse Error qui est déclenchée par le PHP 😉.

Pas assez d'arguments alors erreur intelephense.

Si vous mettez un argument de trop, il n'est pas utilisé. Vous le mettez pour rien, mais il n'y a pas d'erreur de détectée ni de déclenchée à l'exécution.

#2 Valeurs par défaut et arguments nommés open

Pour faire cette partie, j'utilise une fonction qui va afficher trois couleurs.

Maintenant, supposons que je veuille mettre une valeur par défaut à $c2. Eh bien, je n'ai pas le choix, il faut que je déplace $c2 à la fin de la liste des paramètres. Dans ce cas, à l'appel, $c2 sera facultatif.

Maintenant, supposons que je veuille deux valeurs par défaut. Une valeur par défaut pour $c2 et une valeur par défaut pour $c3. Je suis obligé de mettre les deux paramètres qui ont des valeurs par défaut à la fin. Si au moment de l'appel, j'utilise les deux valeurs par défaut, il n'y a pas de problème. Les deux arguments sont facultatifs.

Si je veux utiliser la valeur par défaut de $c2 et mettre une valeur pour $c3 alors là la seule solution est d'utiliser les arguments nommés apparus dans la version 8.0 de PHP. Pour ça, je vais mettre le nom du paramètre devant l'argument.

Pour vous le prouver, ci-dessous, je fais un test en ne mettant pas l'argument nommé. A ce moment-là, la couleur Vert prend la place de $c2 pas celle de $c3 🙃.

Maintenant, ci-dessous, je nomme l'argument. A ce moment-là, la couleur Vert prend la place de $c3 😆.

Je peux mettre des valeurs par défaut partout ! Ensuite, je fais un appel en nommant les seuls arguments que je veux et dans l'ordre que je veux !

Je peux aussi mettre aucune valeur par défaut et nommer un argument. Par exemple, je nomme $c2. Là, je vois qu'à ce moment-là, il faut aussi nommer $c3. Les arguments nommés doivent être placés après les arguments positionnés. C'est la seule contrainte.

En résumé : En PHP 8 au moment de l'appel d'une fonction, vous mettez d'abord les arguments positionnés et ensuite les arguments nommés. Vous pouvez mettre les arguments nommés dans n'importe quel ordre.

Arguments en PHP 8

#3 Mettre des contraintes de type open

Je vais coder une fonction, que je vais appeler diviser. Cette fonction prend deux paramètres en entrée. Un premier paramètre $num qui est le numérateur et un deuxième paramètre $den qui est le dénominateur.

Vous avez la possibilité de mettre des contraintes de type sur les paramètres d'entrée d'une fonction et sur la valeur retournée 😃. Bien sûr, cela va avoir des conséquences si, à l'appel de la fonction, les arguments ne sont pas du type qui est attendu.

Je vais leur donner le type int et je vais mettre en sortie le type int. Pour ça je place int devant le nom des paramètres et : int avant les accolades.

Je vais en profiter pour documenter ce morceau de code. Pour ça je vais me servir de VSCode et de l'extension PHPDoc Comment. Je clique sur function, j'ai une petite ampoule jaune qui apparaît, je clique sur l'ampoule et ensuite sur "Add PHPDoc for diviser". J'ai un pavé de documentation qui est inséré. Je le remplis. Ensuite, lorsque j'appelle la fonction, eh bien, j'ai la description qui apparaît. C'est très pratique.

Ci-dessous, je fais un premier appel avec pour arguments les entiers 6 et 2. Le résultat est un entier, tout est parfait.

Appel de la fonction sans erreur

Maintenant, je vais changer la valeur d'un de mes arguments d'entrée. Je mets l'entier 7 comme numérateur. De cette manière, je vais provoquer un résultat flottant au niveau de la valeur retournée.

A l'exécution, j'ai une notification qui me prévient qu'une conversion implicite a provoqué une perte de précision.

Erreur de conversion sur un type de sortie

Maintenant, je vais tester une valeur flottante sur une valeur d'entrée. Je vais mettre 6.5 pour le numérateur.

Erreur de conversion sur un type d'entrée

Si je mets des arguments qui ont des types qui peuvent être convertis, par exemple des chaînes numériques. Là, l'exécution se fait sans problème. Ce qui veut dire que, dans l'exemple précédent, c'était bien la perte de précision qui provoquait l'erreur et pas la conversion implicite.

Si je mets des arguments qui ont des types qui ne peuvent pas être convertis, par exemple le tableau [6]. Là, si vous avez VSCode avec intelephense, eh bien, vous êtes prévenu. Si vous ne l'avez pas, alors à l'exécution, vous avez une erreur fatale TypeError.

Ci-dessous, on est prévenu par intelephense
TypeError signalée par intelephense
Ci-dessous, on est prévenu à l'exécution
Erreur Fatale : TypeError car un tableau n'est pas prévu comme valeur d'entrée.

Ce que je vais faire, c'est que je vais tester si le dénominateur vaut zéro, et dans ce cas, je vais retourner null. Je fais exprès de provoquer une erreur sur le type de la valeur retournée.

Erreur Fatale : TypeError car le null n'est pas prévue comme valeur de retour.

Pour enlever cette erreur, il faut que je mette comme type de sortie, soit l'union de type null | int, soit un point d'interrogation devant le int : ?int. On dira que la valeur de sortie est nullable.

Retourne null sans erreur

Toutes les exécutions que nous venons de faire, se sont faites, dans un mode par défaut, qui est le mode coercitif. Il existe un autre mode qui est le mode strict. Dans le mode strict, PHP refuse de faire toutes les conversions de type et déclenche un TypeError.

Pour cela, il faut ajouter une directive declare qui active le mode strict (* declare doit être la première instruction du script).

Résumé du comportement de PHP 8 quand il doit convertir un type

#4 Demander à PHP de vérifier qu'aucune valeur ne sera retournée open

Si on veut demander à PHP, de vérifier, qu'il n'y aucune valeur de retournée, alors il faut mettre void comme étant le type de la valeur retournée. Si par erreur, vous retournez par exemple un booléen, et bien, vous aurez une erreur qui sera déjà détectée par le PHP de l'extension intelephense de VSCode 😉. Ce n'est pas nécessaire d'aller jusqu'à l'exécution pour que l'erreur soit signalée.

Une valeur de retour qui n'est pas attendue avec une détection par VSCode Intelephense