PHP ne fait pas de différence entre les fonctions (qui retournent une valeur) et les procédures (qui ne retournent pas de valeur). Ces 2 types de bloc de code réutilisable sont traités de la même façon : par une fonction qui va renvoyer ou pas quelque chose.

Pour qu'une fonction retourne une valeur il faut employer le mot clé return, suivi de la valeur à renvoyer.

La valeur de retour est à comprendre au sens large du terme : valeur littérale, valeur d'une variable, valeur d'une expression, objet. N'importe quel type de données peut être : numérique, booléen, chaîne de caractères, tableau, objets.

return ne peut renvoyer qu'une seule valeur de retour à la fois. Pour renvoyer plusieurs valeurs avec un même return, il faut renvoyer un tableau comme valeur de retour.

On peut mettre autant de return dans le corps d'une fonction que nécessaire. Quand l'interpréteur PHP rencontre return, il arrête immédiatement l'exécution du code de la fonction et passe à l'exécution de l'instruction qui suit l'appel de la fonction.

Le code suivant est la fonction afficher, modifiée pour qu'elle retourne du code HTML.

    function afficher($texte, $titre, $coul = '#FFFF00') {
      if ($texte == '' && $titre == '') {
      	return '';
      }

      if (is_numeric($coul)) {
      	$coul = '#'.dechex($coul);
      }

      $html = '';

      if ($titre != '') {
      	$html = '<h3 style="background:'.$coul.'">';
      	$html .= $titre.'</h3>';
      }

      if ($texte == '') {
      	return $html;
      }

      return $html.'<p>'.$texte.'</p>';
    }

La fonction commence par tester la valeur des paramètres $texte et $titre. Si ils ont une valeur vide la fonction renvoie une valeur vide car il n'y a rien à afficher (donc fin de la fonction).
Le test suivant sur la valeur du paramètre $coul a déjà été vu.
Nous avons ensuite l'initialisation de la variable $html qui contiendra la valeur de retour.
Puis, si le paramètre $titre contient bien un titre, le code HTML correspondant à l'affichage de ce titre est généré dans $html.
Ensuite, si le paramètre $texte est vide, la variable $html est retournée (donc fin de la fonction).
Finalement, le code HTML correspond au texte est concaténé à la variable $html et la valeur de cette expression est renvoyée.

Bien sûr l'appel de la fonction doit être modifié pour récupèrer la valeur renvoyée par la fonction (voir l'exemple suivant)

Exemple : retourner une valeur
<!DOCTYPE html> <html lang="fr"> <head><title>Test fonction</title></head> <body> <?php function afficher($texte, $titre, $coul = '#FFFF00') { if ($texte == '' && $titre == '') { return ''; } if (is_numeric($coul)) { $coul = '#'.dechex($coul); } $html = ''; if ($titre != '') { $html = '<h3 style="background:'.$coul.'">'; $html .= $titre.'</h3>'; } if ($texte == '') { return $html; } return $html.'<p>'.$texte.'</p>'; } //------------------------------------------------------ $txt = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'; $retour = afficher($txt, 'Introduction', 16776960); echo $retour; $txt = 'Phasellus vel erat eu elit mattis lobortis non elementum risus.'; echo afficher($txt, 'Développement', '#FFFF00'); ?> </body> </html>

### Exercice : valeur de retour

Modifiez la fonction calculer de l'exercice précédent pour qu'elle renvoie la valeur calculée au lieu de l'afficher. Mettez en place la vérification des paramètres reçus : le 1er paramètre doit être '+' ou '*', les paramètres suivants doivent être des nombres. Si la vérification est négative, un message d'erreur (chaîne de caractères) doit être retourné.

Une solution possible

Exercice : valeur de retour
<!DOCTYPE html> <html lang="fr"> <head> <title>Calculer</title> </head> <body> <?php function calculer() { $nbArg = func_num_args(); if ($nbArg < 2) { return 'Nombre de paramètres insuffisants'; } $op = func_get_arg(0); if ($op == '+') { $resultat = 0; } elseif ($op == '*') { $resultat = 1; } else { return 'Opération indéfinie'; } for ($i = 1; $i < $nbArg; $i++) { $arg = func_get_arg($i); if (!is_numeric(func_get_arg($i))) { return 'Le paramètre '.$i.' n\'est pas numérique'; } ($op == '+') ? $resultat += $arg : $resultat *= $arg; } return $resultat; } echo '<hr>', calculer('+', 1, 2 ,3, 4); echo '<hr>', calculer('*', 1, 2, 3, 4); echo '<hr>', calculer(); echo '<hr>', calculer('-', 1, 2, 3, 4); echo '<hr>', calculer('+', 1, 'deux', 3); ?> </body> </html>