PHP 5.6.0beta1 released

Fonctions de rappel

Les fonctions de rappel peuvent être identifiées via le type callable depuis PHP 5.4. Cette documentation utilise le type callback qui revient exactement au même.

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 la forme d'une 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.

Les méthodes statiques de classe peuvent aussi être passées sans instancier d'objet de cette classe, en passant le nom de la classe au lieu d'un objet à l'index 0. Depuis PHP 5.2.3, il est également possible de passer 'NomDeLaClasse::NomDeLaMethode'.

En dehors des fonctions définies normalement par l'utilisateur, une closure peut aussi être utilisée comme paramètre de type 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 (depuis PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

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

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

call_user_func(array('B''parent::who')); // A
?>

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(15);

// 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: En PHP 4, il était nécessaire d'utiliser une référence pour créer une fonction de rappel qui pointe vers un objet, et non une copie de celui-ci. Pour plus de détails, reportez-vous à l'explication sur les références.

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.

add a note add a note

User Contributed Notes 6 notes

up
16
steve at mrclay dot org
1 year ago
Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.
up
10
andrewbessa at gmail dot com
1 year ago
You can also use the $this variable to specify a callback:

<?php
class MyClass {

    public
$property = 'Hello World!';

    public function
MyMethod()
    {
       
call_user_func(array($this, 'myCallbackMethod'));
    }

    public function
MyCallbackMethod()
    {
        echo
$this->property;
    }

}
?>
up
2
raj dot aditya at gmail dot com
6 days ago
i did the same thing mentioned above but the following code not working. Why?
---------------------------------------------------------
class Alfa1 {
    public static function falfa() {
        echo "In Alfa";
    }
}

class Beta1 extends Alfa1 {
    public static function falfa() {
        echo "In Beta";
    }
}

call_user_func(array('Beta1','parent::flafa'));

Tested in two latest version of PHP both gives:

Warning: call_user_func() expects parameter 1 to be a valid callback, class 'Alfa1' does not have a method 'flafa' in Xampp\htdocs\a.php on line 15
up
0
Yzmir Ramirez
10 hours ago
> As of PHP 5.2.3, it is also possible to pass 'ClassName::methodName'

You can also use 'self::methodName'.  This works in PHP 5.2.12 for me.
up
0
computrius at gmail dot com
6 months ago
When specifying a call back in array notation (ie. array($this, "myfunc") ) the method can be private if called from inside the class, but if you call it from outside you'll get a warning:

<?php

class mc {
   public function
go(array $arr) {
      
array_walk($arr, array($this, "walkIt"));
   }

   private function
walkIt($val) {
       echo
$val . "<br />";
   }

    public function
export() {
        return array(
$this, 'walkIt');
    }
}

$data = array(1,2,3,4);

$m = new mc;
$m->go($data); // valid

array_walk($data, $m->export()); // will generate warning

?>

Output:
1<br />2<br />3<br />4<br />
Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22
up
-2
metamarkers at gmail dot com
10 months ago
you can pass an object as a callable if its class defines the __invoke() magic method..
To Top