Je suis toujours étonné de voir de nombreux développeurs PHP, pourtant habitués à travailler avec des callbacks en JavaScript, connaître si peu voire pas du tout les callbacks PHP.
C'est pourquoi je vous propose aujourd'hui un petit rappel des callbacks en PHP :
Un callback, c'est quoi ? En un mot, Un callback est une référence vers un code exécutable.
L'utilisation de callbacks est très fréquente dans certains langages. Un exemple simple en JavaScript :
La fonction doAnything() est un callback, qui sera exécuté à chaque clic sur le lien.
En PHP, les callbacks peuvent être définis de nombreuses manières :
Les callbacks peuvent référer une fonction existante. Dans ce cas, on utilise le nom de la fonction comme callback :
De la même façon, on peut référer une méthode de classe, avec cette fois quelques subtilités :
Equivaut à :
Ou encore (méthode statique) :
Pour accéder au parent de la classe actuelle, utilisez le mot clef "parent" de cette façon :
et cela de la même façon pour self et static :
le plus simple est sans doute d'utiliser la fonction call_user_func :
le moins élégant (c'est le moins qu'on puisse dire :-)) est d'utiliser la syntaxe suivante :
Nous allons nous attarder maintenant sur les paramètres à passer au callback. C'est simple :
la fonction call_user_func a une soeur, call_user_func_array, qui permet de passer les paramètres sous forme de tableau :
Jusque là, c'est simple. Il faut juste faire attention au passages de paramètres par référence. En effet, la fonction call_user_func() ne passe pas les paramètres par référence :
Il faut ruser et passer par call_user_func_array() en forçant la référence :
Les appels de fonctions de type callback sont plus lents que des appels de fonction directs. Voici un bench sur 1 million d'itérations :
Certes il y a une différence, mais dans application standard cette différence est généralement négligeable.
Vous me direz que PHP n'est pas à la base un langage où l'utilisation massive des callbacks est pertinente. Mais bien utilisé, les callbacks peuvent significativement alléger le code, et en voici un exemple trivial :
Et vous, vous avez l'habitude d'utiliser des callbacks, ou bien vous réservez ça pour d'autres langages ?
© Jean-François Lépine, 2013 - 2024