• 8 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

Ce cours existe en livre papier.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 02/11/2021

Exploitez toute la puissance des fonctions PHP !

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

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 !

Image d'un petit robot humanoïde
Une fonction est comme un robot

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 :

  1. 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).

  2. 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 :

  1. La clé is_enabled est true  .

  2. L'utilisateur doit être connecté.

  3. L'utilisateur doit avoir un rôle administrateur.

  4. L'utilisateur doit être majeur.

  5. 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 crypter 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) :

  1. La fonction allowRecipe est appelée avec un tableau en paramètre.

  2. 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 :

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 :

  1. strlen pour calculer la longueur d'une chaîne de caractères ;

  2. str_replace pour rechercher et remplacer une chaîne de caractères ;

  3. 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 :

  1. La chaîne qu'on recherche – ici, les « c » (on aurait pu rechercher un mot aussi).

  2. La chaîne qu'on veut mettre à la place – ici, on met des « C » à la place des « c ».

  3. 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 $annee;

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');
$minut = date('i');
// Maintenant on peut afficher ce qu'on a recueilli
echo 'Bonjour ! Nous sommes le ' . $day . '/' . $month . '/' . $year . 'et il est ' . $hour. ' h ' . $minut;
?>

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).

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 :

  1. Vérifier si la recette est valide.

  2. Récupérer des recettes à afficher.

  3. 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,

  1. Vous devez taper function  (en français, ça veut dire « fonction »).

  2. 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 $recipes 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,
];
$suhis = [
'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 :

  1. Boucler sur les recettes valides.

  2. Prendre l'e-mail.

  3. Boucler sur les utilisateurs de la plateforme.

  4. Si les e-mails correspondent, prendre le nom.

  5. Sinon, continuer à parcourir la liste des utilisateurs.

Une solution tout à fait valide serait donc celle-ci (avec une boucle dans une boucle) :

<?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,
],
];
$recipes = [
[
'title' => 'Cassoulet',
'recipe' => '',
'author' => 'mickael.andrieu@exemple.com',
'is_enabled' => true,
],
[
'title' => 'Couscous',
'recipe' => '',
'author' => 'mickael.andrieu@exemple.com',
'is_enabled' => false,
],
[
'title' => 'Escalope milanaise',
'recipe' => '',
'author' => 'mathieu.nebra@exemple.com',
'is_enabled' => true,
],
[
'title' => 'Salade Romaine',
'recipe' => '',
'author' => 'laurene.castor@exemple.com',
'is_enabled' => false,
],
];
function displayAuthor(string $authorEmail, array $users) : string
{
for ($i = 0; $i < count($users); $i++) {
$author = $users[$i];
if ($authorEmail === $author['email']) {
return $author['full_name'] . '(' . $author['age'] . ' ans)';
}
}
}
function isValidRecipe(array $recipe) : bool
{
if (array_key_exists('is_enabled', $recipe)) {
$isEnabled = $recipe['is_enabled'];
} else {
$isEnabled = false;
}
return $isEnabled;
}
function getRecipes(array $recipes) : array
{
$valid_recipes = [];
foreach($recipes as $recipe) {
if (isValidRecipe($recipe)) {
$valid_recipes[] = $recipe;
}
}
return $valid_recipes;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Recettes de cuisine</title>
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
rel="stylesheet"
>
</head>
<body>
<div class="container">
<h1>Liste des recettes de cuisine</h1>
<?php foreach(getRecipes($recipes) as $recipe) : ?>
<article>
<h3><?php echo $recipe['title']; ?></h3>
<div><?php echo $recipe['recipe']; ?></div>
<i><?php echo displayAuthor($recipe['author'], $users); ?></i>
</article>
<?php endforeach ?>
</div>
</body>
</html>

Avec pour résultat ceci :

Capture d'écran qui montre l'affichage du nom des utilisateurs sur la page web : Mickaël est associé à la recette
L'affichage du nom des utilisateurs, c'est fait !

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 !

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, crypter 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 !

Exemple de certificat de réussite
Exemple de certificat de réussite