Menu

Fonctions anonymes et closures PHP : le mot-clé use

Une fonction anonyme (closure) est une fonction sans nom rangée dans une variable : $greet = function ($name) { return "Hi $name"; };. Le mot-clé use, la capture par référence, les callables, la syntaxe de callable de première classe strlen(...) et les closures dans les classes.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une fonction anonyme, aussi appelée closure, est une fonction sans nom. Vous écrivez function ($param) { ... } là où une valeur est attendue : l'affecter à une variable, la passer à une autre fonction ou la renvoyer. Elle peut emporter des variables du code environnant avec use ($var).

Chaque fonction anonyme est un objet de la classe native Closure, c'est pourquoi elle peut être stockée, transmise et appelée plus tard avec $greet(...).

Le mot-clé use capture par valeur

Une closure ne voit pas d'elle-même les variables extérieures. use ($x) copie la valeur de $x dans la closure au moment où la closure est créée, pas quand elle s'exécute :

use par référence : &$var

use (&$x) donne à la closure la variable elle-même plutôt qu'une copie. Les modifications faites dans la closure sont visibles à l'extérieur, et celles faites à l'extérieur sont vues à l'intérieur. C'est ainsi qu'un callback ajoute à un total ou tient un compteur.

Chaque appel à makeCounter() crée un nouveau $count, et la closure renvoyée le garde en vie après le retour de la fonction. C'est ce que désigne « closure » : la fonction se referme sur les variables dont elle a besoin.

Passer une closure en callback

Des fonctions comme array_map(), array_filter(), usort() et array_walk() prennent une fonction en argument. Une closure permet de l'écrire sur place, avec autant d'instructions que nécessaire :

Quand le corps est une seule expression, une fonction fléchée comme fn($p) => $p['price'] est plus courte et n'a pas besoin de use.

Callables : noms de fonctions, méthodes et strlen(...)

Un paramètre typé callable accepte plus que des closures. Une chaîne avec un nom de fonction, un tableau avec un objet et un nom de méthode, et un tableau avec un nom de classe et une méthode statique comptent tous. Depuis PHP 8.1, la syntaxe de callable de première classe strlen(...) transforme directement n'importe lequel en Closure.

La forme (...) est vérifiée quand la ligne s'exécute : une faute de frappe lève une Error immédiatement. Une chaîne comme 'strtoupr' n'est qu'une chaîne jusqu'à ce que quelqu'un essaie de l'appeler.

Closures dans une classe : $this et static

Une closure créée dans une méthode a $this lié automatiquement, elle peut donc utiliser les propriétés de l'objet. Marquez-la static function quand elle n'a pas besoin de $this, ce qui l'empêche aussi de garder l'objet en vie.

Oublier use

Le bug de closure le plus courant est d'utiliser une variable extérieure sans la lister dans use. Dans la closure, la variable n'existe pas :

$minAge = 18;
$adults = array_filter($people, function ($p) {
    return $p['age'] >= $minAge;   // $minAge is not in use (...)
});
PHP prints: Warning: Undefined variable $minAge

$minAge vaut null à l'intérieur, tout âge comparé >= null est vrai, et chaque personne passe le filtre. Sur un serveur qui masque les warnings, rien ne vous prévient. Ajoutez la variable à use :

Questions fréquentes

Qu'est-ce qu'une closure en PHP ?

Une fonction sans nom, créée avec function (...) { ... } et rangée dans une variable ou passée en argument. PHP la représente comme un objet de la classe Closure. Elle peut emporter des variables de la portée où elle a été créée, listées dans use (...).

Que fait le mot-clé use dans une closure PHP ?

use ($x) copie la variable extérieure $x dans la closure au moment où la closure est créée. Les modifications ultérieures de $x à l'extérieur ne sont pas vues. Écrivez use (&$x) pour partager la variable, afin que les modifications aillent dans les deux sens.

Qu'est-ce qu'un callable en PHP ?

Tout ce que PHP peut appeler : une closure, un nom de fonction sous forme de chaîne ('strtoupper'), un tableau [$object, 'method'] ou [ClassName::class, 'staticMethod'], ou un objet avec __invoke(). Utilisez le type callable pour accepter n'importe lequel et is_callable() pour vérifier.

Que signifie strlen(...) en PHP ?

C'est la syntaxe de callable de première classe de PHP 8.1 : strlen(...) crée une Closure à partir de la fonction sans l'appeler. Elle fonctionne aussi pour les méthodes, $obj->method(...), et les méthodes statiques, Foo::bar(...), et elle est vérifiée quand la ligne s'exécute, contrairement à un nom sous forme de chaîne.

Faut-il un point-virgule après une fonction anonyme ?

Oui, quand vous l'affectez : $f = function () { ... }; est une instruction d'affectation, elle se termine donc par ;. L'oublier est une erreur de syntaxe. Une closure passée directement en argument n'a pas besoin de son propre point-virgule.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER