Nous profiterons de ces nouvelles connaissances pour améliorer et simplifier le code de l'affichage des recettes en recoupant la liste des utilisateurs et des recettes pour afficher, non pas leur e-mail, mais directement leur nom à côté de la recette.
Attendez mais d'abord, qu'est-ce qu'une fonction ?
Imaginez que les fonctions sont des robots. Vous ne savez pas ce qui se passe à l'intérieur de ce robot, mais vous pouvez appuyer sur un bouton pour lui demander de faire quelque chose de précis. Avec les fonctions, c'est le même principe !
Comprenez le principe d'une fonction
Voici le genre de dialogue qu'on peut avoir avec une fonction :
"Toi, la fonction
allowRecipe
, dis-moi si j'ai le droit d'afficher cette recette".
La fonction effectue les calculs demandés puis répond :
"Oui, tu peux".
En clair :
On donne en entrée à la fonction un paramètre sur lequel elle va faire des calculs (ici, une recette sous forme d'un tableau).
Et la fonction nous retourne en sortie le résultat :
true
.
<?php
$recipe = [
'title' => 'Escalope milanaise',
'recipe' => '',
'author' => 'mathieu.nebra@exemple.com',
'is_enabled' => true,
];
allowRecipe($recipe); // retourne le booléen true
Bon, ici c'était assez simple : il suffisait de vérifier la valeur de la clé is_enabled
.
Mais vous serez souvent amené à faire des opérations de plus en plus complexes, et les fonctions vous permettront de ne pas avoir à vous soucier des détails des calculs.
Les fonctions deviennent pratiques quand on a besoin de l'information plusieurs fois, et qu'il y a plusieurs conditions à respecter.
Imaginons par exemple que les conditions pour l'affichage d'une recette évoluent :
La clé
is_enabled
esttrue
.L'utilisateur doit être connecté.
L'utilisateur doit avoir un rôle administrateur.
L'utilisateur doit être majeur.
Etc.
Nous n'allons pas recopier et implémenter toutes ces instructions à chaque fois, nous utiliserons une fonction dont le rôle sera de retourner true
ou false
.
En quoi est-ce différent des boucles ? Avec les boucles, on peut faire répéter le même code plusieurs fois aussi !
Oui, mais les fonctions sont capables de s'adapter en fonction des informations que vous leur envoyez. Par exemple dans notre cas, il suffit de transmettre l'array $recipe
à notre fonction pour qu'elle nous retourne le résultat. Ces informations que l'on donne en entrée à la fonction sont appelées paramètres (un mot à connaître !).
Concrètement, les fonctions peuvent permettre de récupérer des informations comme la date et l'heure actuelles, de chiffrer des données, d'envoyer des e-mails, de faire des recherches dans du texte, et bien d'autres choses encore !
Nous avons jusqu'ici imaginé un cas d'utilisation très simple que nous avions résolu précédemment avec une boucle et une condition, ce qui n'est pas très intéressant.
Revenons aux choses sérieuses et concrètes, et explorons les fonctions pour pouvoir par la suite afficher le nom de l'auteur plutôt que l'e-mail lors de l'affichage d'une recette.
Appelez une fonction
En PHP, comment appelle-t-on une fonction ? Par son nom, pardi !
Exemple :
<?php
allowRecipe();
Comme vous le voyez, j'ai simplement écrit le nom de la fonction, suivi de parenthèses vides, puis de l'inévitable point-virgule. En faisant cela, j'appelle la fonction allowRecipe
mais je ne lui envoie aucune information, aucun paramètre.
Si on veut lui envoyer un paramètre (un nombre, une chaîne de caractères, un booléen...), il faut l'écrire entre les parenthèses :
<?php
/**
* Il n'est pas nécessaire de déclarer une variable $recipe
* pour passer l'information en tant que paramètre d'une fonction.
*/
allowRecipe([
'title' => 'Escalope milanaise',
'recipe' => '',
'author' => 'mathieu.nebra@exemple.com',
'is_enabled' => true,
]);
Ainsi, allowRecipe
saura qu'elle doit travailler avec le tableau PHP passé en paramètre.
Souvent, les fonctions acceptent plusieurs paramètres. Vous devez dans ce cas les séparer par des virgules :
<?php
fonctionImaginaire(17, 'Vert', true, 41.7);
Cette fonction recevra quatre paramètres :
17 ;
le texte « Vert » ;
le booléen Vrai ;
et le nombre 41,7.
Récupérez la valeur de retour de la fonction
Maintenant que nous savons appeler une fonction et même lui envoyer plusieurs paramètres, il faut récupérer ce qu'elle nous retourne, si toutefois elle retourne quelque chose.
Si la fonction ne retourne aucune valeur, il n'y a rien de plus à faire que dans les codes précédents. La fonction est appelée, elle fait son travail. On ne lui demande rien de plus.
En revanche, si la fonction retourne une valeur (comme ça devrait être le cas pour allowRecipe
), on la récupère dans une variable, comme ceci :
<?php
$isAllowed = allowRecipe([
'title' => 'Escalope milanaise',
'recipe' => '',
'author' => 'mathieu.nebra@exemple.com',
'is_enabled' => true,
]);
if ($isAllowed) {
echo 'La recette doit être affichée !';
} else {
echo 'La recette doit être cachée !';
}
Sur une ligne comme celle-ci, il se passe en fait les deux choses suivantes (dans l'ordre, et de droite à gauche) :
La fonction
allowRecipe
est appelée avec un tableau en paramètre.Le résultat renvoyé par la fonction (lorsqu'elle a terminé) est stocké dans la variable
$isAllowed
.
La variable $isAllowed
aura donc pour valeur true
après l'exécution de cette ligne de code !
Utilisez les fonctions prêtes à l'emploi de PHP
Ces fonctions sont très pratiques. En fait, c'est en partie là que réside la force de PHP : ses fonctions sont vraiment excellentes car elles couvrent la quasi-totalité de nos besoins. En fait, pratiquement à chaque fois que je m'apprêtais à écrire une fonction, j'ai pu remarquer que celle-ci existait déjà.
Voici un petit aperçu de ce que peuvent vous permettre de faire des fonctions PHP :
str_replace
pour rechercher et remplacer des mots dans une variable ;move_uploaded_file
pour envoyer un fichier sur un serveur ;imagecreate
pour créer des images miniatures (aussi appelées "thumbnails") ;mail
pour envoyer un mail avec PHP (très pratique pour faire une newsletter) ;de nombreuses options pour modifier des images, y écrire du texte, tracer des lignes, des rectangles, etc. ;
crypt
pour chiffrer des mots de passe ;date
pour renvoyer l'heure, la date, etc.
Dans la plupart des cas, il faudra indiquer des paramètres à la fonction, pour qu'elle sache sur quoi travailler.
Nous allons ici découvrir rapidement quelques fonctions pour vous habituer à les utiliser.
Nous allons voir :
trois fonctions qui effectuent des modifications sur des chaînes de caractères ;
et une qui permet de récupérer la date.
Ce sont seulement des exemples destinés à vous habituer à utiliser des fonctions.
Manipulez du texte avec les fonctions
De nombreuses fonctions permettent de manipuler le texte. En voici trois qui peuvent être utiles :
strlen
pour calculer la longueur d'une chaîne de caractères ;str_replace
pour rechercher et remplacer une chaîne de caractères ;sprintf
pour formater une chaîne de caractères.
Calculez la longueur d'une chaîne de caractères avec strlen
Exemple :
<?php
$recipe = 'Etape 1 : des flageolets ! Etape 2 : de la saucisse toulousaine';
$length = strlen($recipe);
echo 'La phrase ci-dessous comporte ' . $length . ' caractères :' . PHP_EOL . $recipe;
$ php exemple.php La phrase ci-dessous comporte 63 caractères : Etape 1 : des flageolets ! Etape 2 : de la saucisse toulousaine
Dans le même ordre d'idée, la fonction count
permet aussi de compter le nombre d'éléments dans un tableau ; car en PHP une chaîne de caractères, c'est… un tableau de caractères !
Recherchez et remplacez une chaîne de caractères avec str_replace
Exemple :
<?php
echo str_replace('c', 'C', 'le cassoulet, c\'est très bon');
$ php exemple.php le Cassoulet, C'est très bon
On a besoin d'indiquer trois paramètres :
La chaîne qu'on recherche – ici, les « c » (on aurait pu rechercher un mot aussi).
La chaîne qu'on veut mettre à la place – ici, on met des « C » à la place des « c ».
La chaîne dans laquelle on doit faire la recherche.
Ce qui nous donne « le Cassoulet, C'est très bon ».
Formatez une chaîne de caractères avec sprintf
La fonction sprintf
permet de formater une chaîne de caractères.
Elle est très pratique lorsque nous avons besoin de passer plusieurs variables et elle peut remplacer la concaténation pour des raisons de lisibilité du code.
<?php
$recipe = [
'title' => 'Salade Romaine',
'recipe' => 'Etape 1 : Lavez la salade ; Etape 2 : euh ...',
'author' => 'laurene.castor@exemple.com',
];
echo sprintf(
'%s par "%s" : %s',
$recipe['title'],
$recipe['author'],
$recipe['recipe']
);
$ php exemple.php Salade Romaine par "laurene.castor@exemple.com" : Etape 1 : Lavez la salade ; Etape 2 : euh ...
Récupérez la date
Nous allons découvrir la fonction qui renvoie l'heure et la date. Il s'agit de date
(un nom facile à retenir, avouez !).
Cette fonction peut donner beaucoup d'informations. Voici les principaux paramètres à connaître :
Paramètre | Description |
---|---|
H | Heure |
i | Minute |
d | Jour |
m | Mois |
Y | Année |
Si vous voulez afficher l'année, il faut donc envoyer le paramètre Y
à la fonction :
<?php
$year = date('Y');
echo $year;
On peut bien entendu faire mieux ; voici la date complète et l'heure :
<?php
// Enregistrons les informations de date dans des variables
$day = date('d');
$month = date('m');
$year = date('Y');
$hour = date('H');
$minute = date('i');
// Maintenant on peut afficher ce qu'on a recueilli
echo 'Bonjour ! Nous sommes le ' . $day . '/' . $month . '/' . $year . 'et il est ' . $hour. ' h ' . $minute;
?>
Et voilà le travail ! On a pu afficher la date et l'heure en un clin d'œil.
Normalement, quand vous avez testé le code précédent, vous avez dû avoir la date et l'heure exactes (n'hésitez donc pas à essayer d'exécuter ce code source chez vous).
C'est bien, mais ça fait beaucoup de code pour afficher simplement la date et l'heure. Y a-t-il une façon plus concise de le faire en PHP ?
Absolument ! Pour simplifier le code, nous pouvons utiliser les formats de la fonction date
, comme ceci :
$date = date('d/m/Y');
$time = date('H \h i');
Ces lignes de code effectuent le même travail que les lignes précédentes, mais de manière plus concise. date('d/m/Y')
formate la date sous la forme jour/mois/année, et date('H \h i')
formate l'heure sous le format heure h minute (exemple 12 h 25). Voici la version finale :
<?php
// Enregistrons les informations de date dans des variables
$date = date('d/m/Y');
$time = date('H \h i');
// Maintenant on peut afficher ce qu'on a recueilli
echo "Bonjour ! Nous sommes le {$date} et il est {$time}";
?>
Créez vos propres fonctions
Quand écrire une fonction ?
En général, si vous effectuez des opérations un peu complexes que vous pensez avoir besoin de refaire régulièrement, il est conseillé de créer une fonction.
Nous allons découvrir la création de fonctions à travers trois exemples :
Vérifier si la recette est valide.
Récupérer des recettes à afficher.
Récupérer le nom d'un utilisateur en fonction de l'e-mail associé à la création d'une recette.
Exemple 1 : vérifiez la validité d'une recette
Un premier exemple simple, c'est d'établir une fonction qui retourne :
true
si la recette est valide ;faux
si la recette ne l'est pas.
Pour cela, nous avions utilisé une condition if
pour vérifier la propriété is_enabled
de la recette. C'est l'occasion de réutiliser des connaissances vues dans le chapitre des tableaux et des conditions :
<?php
$recipe = [
'title' => 'Salade Romaine',
'recipe' => 'Etape 1 : Lavez la salade ; Etape 2 : euh ...',
'author' => 'laurene.castor@exemple.com',
'is_enabled' => true,
];
// au minimum
if ($recipe['is_enabled']) {
return true;
} else {
return false;
}
// mieux
$isEnabled = $recipe['is_enabled'];
// encore mieux !
if (array_key_exists('is_enabled', $recipe)) {
$isEnabled = $recipe['is_enabled'];
} else {
$isEnabled = false;
}
On va quand même pas réécrire ça à chaque fois qu'on a besoin de vérifier si une recette est valide, si ?
Non, c'est tout l'objectif de ce chapitre du cours !
Voici la fonction correspondante :
<?php
function isValidRecipe(array $recipe) : bool
{
if (array_key_exists('is_enabled', $recipe)) {
$isEnabled = $recipe['is_enabled'];
} else {
$isEnabled = false;
}
return $isEnabled;
}
Pour créer une fonction,
Vous devez taper
function
(en français, ça veut dire « fonction »).Ensuite, donnez-lui un nom. Par exemple, celle-ci s'appelle
isValidRecipe
.
Ce qui est plus particulier après, c'est ce qu'on met entre parenthèses : il y a une variable. C'est le paramètre dont a besoin la fonction pour travailler, ici il s'agit de notre tableau.
Nous pouvons – et c'est une bonne pratique – définir le type de la variable attendue : ici, nous souhaitons un tableau donc nous préfixons la variable $recipe
par le mot-clé array
.
Notre fonction peut aussi – et c'est une deuxième bonne pratique – donner un type de retour, c'est-à-dire le type de valeur que la fonction doit retourner.
Ici, nous récupérons soit true
, soit false
donc le type est bool.
Ensuite, vous repérez des accolades. Elles permettent de marquer les limites de la fonction. Cette dernière commence dès qu'il y a une {
et se termine lorsqu'il y a une }
. Entre les deux, il y a son contenu.
Voilà, la fonction est créée, vous n'avez plus besoin d'y toucher. Après, pour faire appel à elle, il suffit d'indiquer son nom, et de préciser ses paramètres entre parenthèses.
Exemple :
<?php
// 2 exemples
$romanSalad = [
'title' => 'Salade Romaine',
'recipe' => 'Etape 1 : Lavez la salade ; Etape 2 : euh ...',
'author' => 'laurene.castor@exemple.com',
'is_enabled' => true,
];
$sushis = [
'title' => 'Sushis',
'recipe' => 'Etape 1 : du saumon ; Etape 2 : du riz',
'author' => 'laurene.castor@exemple.com',
'is_enabled' => false,
];
// Répond true !
$isRomandSaladValid = isValidRecipe($romanSalad);
// Répond false !
$isSushisValid = isValidRecipe($sushis);
Exemple 2 : récupérez les recettes "valides"
Rappelez-vous, nous avions convenu que nous devions afficher la liste des recettes valides.
Nous venons de créer la fonction qui permet de vérifier qu'une recette est valide, il nous manque maintenant à boucler sur la liste des recettes : voilà une première occasion de réutiliser la fonction créée précédemment !
<?php
$recipes = [...]; // Les recettes
// AVANT
foreach ($recipes as $recipe) {
if ($recipe['is_enabled']) {
// echo $recipe['title'] ..
}
}
// APRES
function getRecipes(array $recipes) : array
{
$validRecipes = [];
foreach($recipes as $recipe) {
if (isValidRecipe($recipe)) {
$validRecipes[] = $recipe;
}
}
return $validRecipes;
}
// construire l'affichage HTML des recettes
foreach(getRecipes($recipes) as $recipe) {
// echo $recipe['title'] ..
}
Ici, la fonction contient le code nécessaire à la récupération des recettes valides.
Comme précédemment, on boucle et on ne conserve que les recettes valides identifiées grâce à la fonction isValidRecipe
.
Exemple 3 : affichez le nom de l'auteur
Allez, on passe à la vitesse supérieure. Nous allons créer une fonction pour améliorer l'affichage, ce qui nous donne à nouveau l'occasion de manipuler des tableaux.
Cette fois, la problématique est de relier l'e-mail associé à un compte utilisateur à l'e-mail utilisé pour la contribution d'une recette.
Si on découpe le problème en étapes, vous avez déjà toutes les connaissances nécessaires :
Prendre l'e-mail.
Boucler sur les utilisateurs de la plateforme.
Si les e-mails correspondent, prendre le nom et l'âge.
Sinon, continuer à parcourir la liste des utilisateurs.
Une solution tout à fait valide serait donc celle-ci (avec une boucle dans une boucle) :
<?php
function displayAuthor(string $authorEmail, array $users): string
{
foreach ($users as $user) {
if ($authorEmail === $user['email']) {
return $user['full_name'] . '(' . $user['age'] . ' ans)';
}
}
}
Avec pour résultat ceci :
Exploitez toute la puissance de la documentation PHP !
Le langage PHP fournit énormément de fonctions pour vous aider à développer vos sites web, vous devez donc toutes les apprendre.
Bien sûr que non !
L'équipe de développeurs qui a créé et fait évoluer PHP a publié un site web dans lequel toutes les fonctions du langage PHP sont expliquées et détaillées avec des exemples !
Exercez-vous
Ajoutons les fonctions dans notre projet fil rouge.
Utilisez le tableau fourni
$users
qui contient plusieurs utilisateurs. Chaque utilisateur possède des clés telles quefull_name
,email
etage
.<?php $users = [ [ 'full_name' => 'Mickaël Andrieu', 'email' => 'mickael.andrieu@exemple.com', 'age' => 34, ], [ 'full_name' => 'Mathieu Nebra', 'email' => 'mathieu.nebra@exemple.com', 'age' => 34, ], [ 'full_name' => 'Laurène Castor', 'email' => 'laurene.castor@exemple.com', 'age' => 28, ], ];
Ajoutez les fonctions
isValidRecipe
,getRecipes
etdisplayAuthor
.Retirez le test pour savoir si une recette est activée.
Modifiez la boucle pour utiliser la fonction
getRecipes
à la place du tableau des recettes.Utilisez la fonction
displayAuthor
pour afficher l'auteur.Testez votre page web : assurez-vous que votre page affiche les recettes avec l'auteur et son âge.
En résumé
Les fonctions sont des blocs de code qui exécutent des instructions selon certains paramètres.
Les fonctions ont généralement une entrée et une sortie, et peuvent avoir un type (string, int, bool, array...).
PHP propose des centaines de fonctions prêtes à l'emploi pour tout type de tâches : envoyer un e-mail, récupérer l'heure, chiffrer des mots de passe, etc.
Si PHP ne propose pas la fonction dont on a besoin, il est possible de la créer avec le mot-clé
function
: on définira alors le type des paramètres et du retour de la fonction.
OK c'était bien tout ça, mais qu'est-ce que je fais si mon script plante ?
C'est justement ce que l'on va voir dans le prochain chapitre. Allez, suivez-moi !