Fonctions

1. Introduction

À l’instar des différents langages de développement, PHP offre la possibilité de définir ses propres fonctions (appelées fonctions « utilisateur ») avec tous les avantages associés (modularité, capitalisation…). Une fonction est un ensemble d’instructions identifiées par un nom, dont l’exécution retourne une valeur et dont l’appel peut être utilisé comme opérande dans une expression. Une procédure est un ensemble d’instructions identifiées par un nom qui peut être appelé comme une instruction.

2. Déclaration et appel

Fonction PHP:déclaration et appel

Le mot-clé function permet d’introduire la définition d’une fonction.

function

Syntaxe

function nom_fonction([paramètres]) [: type] { 
  instructions; 
} 

nom_fonction

Nom de la fonction (doit respecter les règles de nommage présentées dans le chapitre Introduction à PHP - Structure de base d’une page PHP). Ce nom n’est pas sensible à la casse (pour PHP les fonctions unefonction et UneFonction sont les mêmes).

paramètre

Paramètres éventuels de la fonction exprimés sous forme d’une liste de variables (cf. Paramètres) : $paramètre1, $paramètre2, ...

type

Déclaration du type de données retourné par la fonction. Valeurs possibles : int, float, string, bool, array, callable, iterable, object, mixed, void, never, un nom de classe ou d’interface (cf. dans ce chapitre la section Classes), une union de types, ou une intersection de types. Le nom du type peut être précédé d’un point d’interrogation (?) qui indique que la fonction peut retourner une valeur NULL, sauf pour les types suivants : void, never, mixed (déjà inclus), union de types (peut être ajouté dans l’union) et intersection de types. Voir le chapitre Introduction à PHP pour la définition des types de données (section Les bases du langage PHP - Types de données).

void

instructions

Ensemble des instructions qui composent la fonction.

Le nom de la fonction ne doit pas être un mot réservé PHP (nom de fonction, d’instruction) ni être égal au nom d’une autre fonction préalablement définie.

Une fonction utilisateur s’appelle comme une fonction native de PHP : dans une affectation, dans une comparaison, etc.

Si la fonction retourne une valeur, il est possible d’utiliser l’instruction return pour définir la valeur de retour de la fonction.

Syntaxe

 returnreturn [expression]; 

expression

Expression dont le résultat constitue la valeur de retour de la fonction (NULL par défaut).

Le résultat d’une fonction peut être de n’importe quel type (chaîne, nombre, tableau, etc.).

L’instruction return stoppe l’exécution de la fonction et retourne le résultat de expression à l’appelant. Si plusieurs instructions return sont présentes dans la fonction, c’est la première rencontrée dans le déroulement des instructions qui définit la valeur de retour et provoque l’interruption de la fonction. Si la fonction ne comporte aucune instruction return (ou si aucune instruction return n’est exécutée), la valeur de retour de la fonction est NULL.

Exemple

<?php 
// Fonction sans paramètre qui affiche "Bonjour !" 
// Pas de valeur de retour. 
function afficher_bonjour() { 
  echo 'Bonjour !<br />'; 
} 
// Fonction avec 2 paramètres qui retourne le produit 
// des deux paramètres. 
function produit($valeur1,$valeur2) { 
  return $valeur1 * $valeur2; 
} 
// Appel de la fonction afficher_bonjour 
afficher_bonjour(); 
// Utilisations de la fonction produit : 
// - dans une affectation 
$résultat = produit(2,4); 
echo "2 x 4 = $résultat<br />"; 
// - dans une comparaison 
if (produit(10,12) > 100) { 
  echo '10 x 12 est supérieur à 100.<br />'; 
} 
?> 

Résultat

Bonjour ! 
2 x 4 = 8 
10 x 12 est supérieur à 100. 

Dans le langage PHP, il n’existe pas à proprement parler de procédure. Pour définir quelque chose d’équivalent à une procédure, il suffit de définir une fonction qui ne retourne par de valeur et d’appeler la fonction comme si c’était une instruction (comme la fonction afficher_bonjour par exemple). Une fonction qui ne retourne rien peut explicitement être déclarée avec le type de retour void.

Comme nous l’avons déjà évoqué, le contenu d’un tableau peut être transformé en liste de paramètres dans un appel de fonction grâce à l’opérateur ... (trois points de suspension).

Exemple

<?php  
// Fonction avec trois paramètres qui retourne la somme  
// des trois paramètres.  
function somme($valeur1,$valeur2,$valeur3) {  
  return $valeur1 + $valeur2 + $valeur3;  
}  
// Transformation du contenu d'un tableau en   
// liste de paramètres.  
$valeurs = [1,2,3];  
echo '1 + 2 + 3 = ',somme(...$valeurs),'<br />';  
// La même chose pour une partie seulement des paramètres  
// avec un tableau défini directement dans l'appel.  
echo '1 + 2 + 4 = ',somme(1,...[2,4]),'<br />';  
?> 

Résultat

1 + 2 + 3 = 6  
1 + 2 + 4 = 7 

Avec cette syntaxe, il n’est pas possible de passer des paramètres supplémentaires par position après l’utilisation du tableau (mais c’est possible en utilisant le nom du paramètre dans l’appel - voir la section Utilisation du nom du paramètre dans l’appel dans la suite de ce chapitre).

Lorsqu’une fonction retourne un tableau, il est possible d’accéder directement à un élément du tableau lors de l’appel à la fonction avec une syntaxe du type fonction(...)[clé]

Exemple

<?php 
// Définition d'une fonction qui retourne un tableau.  
function qui() { 
  return ['Olivier','Heurtel']; 
} 
// Appel de la fonction et récupération directe du prénom stocké 
// à l'indice 0 du tableau retourné. 
$prénom = qui()[0]; 
echo "qui()[0] = $prénom<br />"; 
?> 

Résultat

qui()[0] = Olivier 

Cette technique fonctionne aussi lorsque la fonction retourne un tableau multidimensionnel avec une syntaxe du type fonction(...)[clé1] [clé2].

Il est possible d’utiliser une fonction avant de la définir. Il n’y a donc aucun problème pour définir des fonctions qui s’appellent entre elles.

Une fonction est utilisable uniquement dans le script où elle est définie. Pour pouvoir l’utiliser dans plusieurs scripts, le mieux est de la définir dans un fichier inclus partout où la fonction est nécessaire.

Déclaration du type de retour Fonction PHP:déclaration du type de retour

Il est possible de définir le type de données retourné par une fonction.

Lorsque c’est le cas, dans le mode de fonctionnement par défaut (à opposer au mode strict présenté ci-dessous), PHP effectue si besoin une conversion automatique de la valeur retournée dans le type de données déclaré.

Exemple

<?php 
// Déclaration de deux fonctions qui retournent le produit 
// des deux paramètres, la deuxième spécifiant un type 
// de données "entier" pour la valeur de retour. 
function produit1($valeur1,$valeur2) { 
  return $valeur1 * $valeur2; 
} 
function produit2($valeur1,$valeur2) : int { 
  return $valeur1 * $valeur2; 
} 
// Appel des deux fonctions avec les mêmes paramètres 
echo 'produit1(20,1/7) => ',var_dump(produit1(20,1/7)),'<br />'; 
echo 'produit2(20,1/7) => <b>',var_dump(produit2(20,1/7)),'</b><br />'; 
?> 

Résultat (si les erreurs de niveau E_DEPRECATED ne sont pas affichées en version 8.1)

produit1(20,1/7) => float(2.8571428571428568)  
produit2(20,1/7) => int(2) 

Sur cet exemple, nous voyons bien que la valeur retournée par la deuxième fonction a été convertie en entier par PHP (avec les règles de conversion évoquées dans le chapitre Introduction à PHP - Les bases du langage - Types de données).

Il faut noter qu’à partir de la version 8.1, l’exemple précédent génère une alerte de niveau E_DEPRECATED s’il y a une perte de précision dans la conversion en entier.

Résultat (si les erreurs de niveau E_DEPRECATED sont affichées en version 8.1)

produit1(20,1/7) => float(2.8571428571429) 
produit2(20,1/7) =>  
Deprecated: Implicit conversion from float 2.8571428571428568 to int 
loses precision in /app/scripts/index.php on line 9 
int(2) 

En revanche, avec cet exemple, il n’y aura pas d’alerte s’il n’y a pas de perte de précision dans la conversion, par exemple avec un appel comme produit2(3/2,2/3) : le résultat est un nombre flottant égal à 1 (float(1)) qui peut être converti en entier sans perte de précision.

Si PHP n’est pas en mesure d’effectuer la conversion (types de données non convertibles entre eux), une exception TypeError est levée ; cette exception interrompt le script si elle n’est pas gérée (cf. dans ce chapitre la section Classes - Exceptions).

Exemple

<?php 
// Déclaration et appel d'une fonction qui doit retourner 
// un tableau mais qui retourne une chaîne de caractères. 
function qui() : array {  
  return 'Olivier Heurtel';  
}  
echo 'qui()[0] = ',qui()[0]; 
?> 

Résultat

qui()[0] =  
Fatal error: Uncaught TypeError: of qui() : Return value must be of the type 
array, string returned in /app/scripts/index.php:5 Stack trace: #0 / 
app/scripts/index.php(7): qui() #1 {main} thrown in/app/scripts/index.php 
on line 5 

Une fonction déclarée avec un type de retour autre que void doit retourner une valeur non NULL. Si ce n’est pas le cas, une erreur est retournée, différente selon les cas :

Absence d’instruction return

Fatal error: Uncaught TypeError: MaFonction(): Return value must be of 
type int...
couv_RI58PH8MY.png

Découvrez 

le livre :

Aussi inclus dans nos :

Précédent
Manipuler les en-têtes HTTP
Suivant
Classes