Fonctions de rappel / Types Callable

Les fonctions de rappel peuvent être identifiées via le type callable.

Certaines fonctions, comme call_user_func() ou usort(), acceptent comme paramètre des fonctions de rappel définies par l'utilisateur. Les fonctions de rappel peuvent être de simples fonctions, mais aussi des méthodes d'objets, y compris des méthodes statiques de classe.

Passage d'une fonction de rappel

Une fonction PHP est passée par son nom, sous forme de chaîne de caractères. Toute fonction interne ou définie par l'utilisateur peut être utilisée, sauf les constructions de langage comme : array(), echo, empty(), eval(), exit(), isset(), list(), print, ou unset().

Une méthode d'un objet instancié est passée comme un tableau contenant un objet à l'index 0, et le nom de la méthode à l'index 1. Accéder aux méthodes protégées et privées à l'intérieur d'une classe est autorisé.

Les méthodes statiques de classe peuvent aussi être passées sans instancier d'objet de cette classe soit, en passant le nom de la classe au lieu d'un objet à l'index 0, ou en passant 'NomDeLaClasse::NomDeLaMethode'.

En dehors des fonctions définies normalement par l'utilisateur, les fonctions anonymes et les fonctions fléchées peuvent aussi être utilisées comme paramètre de type callback.

Note:

À partir de PHP 8.1.0, les fonctions anonymes peuvent aussi être créées en utilisant la syntaxe callable de première classe.

Généralement, tout objet implémentant __invoke() peut aussi être passé au paramètre callback.

Exemple #1 Exemples de fonctions de rappel

<?php

// Un exemple de fonction de rappel
function my_callback_function() {
echo
'hello world!';
}

// Un exemple de méthode de rappel
class MyClass {
static function
myCallbackMethod() {
echo
'Hello World!';
}
}

// Type 1 : Fonction de rappel simple
call_user_func('my_callback_function');

// Type 2 : Appel d'une méthode statique de classe
call_user_func(array('MyClass', 'myCallbackMethod'));

// Type 3 : Appel d'une méthode objet
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4 : Appel d'une méthode statique de classe
call_user_func('MyClass::myCallbackMethod');

// Type 5 : Appel à une méthode statique de classe relative
class A {
public static function
who() {
echo
"A\n";
}
}

class
B extends A {
public static function
who() {
echo
"B\n";
}
}

call_user_func(array('B', 'parent::who')); // A, obsoléte à partir de PHP 8.2.0
// Type 6 : Les objets implémentent __invoke peuvent être utilisés comme callables
class C {
public function
__invoke($name) {
echo
'Hello ', $name, "\n";
}
}

$c = new C();
call_user_func($c, 'PHP!');
?>

Exemple #2 Exemple d'une fonction de rappel utilisant une Closure

<?php
// Notre closure
$double = function($a) {
return
$a * 2;
};

// Ceci est notre intervalle de nombres
$numbers = range(1, 5);

// Utilisation de la closure comme fonction de rappel.
// Ici, pour doubler la taille de chaque élément de notre intervalle
$new_numbers = array_map($double, $numbers);

print
implode(' ', $new_numbers);
?>

L'exemple ci-dessus va afficher :

 2 4 6 8 10 

Note:

Notez que les fonctions de rappel enregistrées avec des fonctions comme call_user_func() et call_user_func_array() ne seront pas appelées si une exception n'est pas interceptée alors qu'elle a été lancée dans une précédente fonction de rappel.

To Top