188 votes

Comment implémenter un callback en PHP ?

Comment les callbacks sont-ils écrits en PHP ?

1 votes

Je vais en citer un autre question à celui-ci, parce que j'essayais d'appeler une fermeture.

172voto

Steve Clay Points 3697

Le manuel utilise les termes "callback" et "callable" de manière interchangeable. Cependant, le terme "callback" fait traditionnellement référence à une chaîne ou à une valeur de tableau qui agit comme un élément d'information. pointeur de fonction La programmation fonctionnelle permet de référencer une fonction ou une méthode de classe pour une invocation future. Cela a permis de mettre en place des éléments de programmation fonctionnelle depuis PHP 4. Les saveurs sont les suivantes :

$cb1 = 'someGlobalFunction';
$cb2 = ['ClassName', 'someStaticMethod'];
$cb3 = [$object, 'somePublicMethod'];

// this syntax is callable since PHP 5.2.3 but a string containing it
// cannot be called directly
$cb2 = 'ClassName::someStaticMethod';
$cb2(); // fatal error

// legacy syntax for PHP 4
$cb3 = array(&$object, 'somePublicMethod');

C'est une manière sûre d'utiliser les valeurs appelables en général :

if (is_callable($cb2)) {
    // Autoloading will be invoked to load the class "ClassName" if it's not
    // yet defined, and PHP will check that the class has a method
    // "someStaticMethod". Note that is_callable() will NOT verify that the
    // method can safely be executed in static context.

    $returnValue = call_user_func($cb2, $arg1, $arg2);
}

Les versions modernes de PHP permettent d'invoquer les trois premiers formats ci-dessus directement en tant que $cb() . call_user_func y call_user_func_array soutenir tout ce qui précède.

Ver: http://php.net/manual/en/language.types.callable.php

Notes/Caveats :

  1. Si la fonction/classe a un espace de nom, la chaîne doit contenir le nom entièrement qualifié. Par exemple ['Vendor\Package\Foo', 'method']
  2. call_user_func ne prend pas en charge le passage de non-objets par référence, vous pouvez donc soit utiliser call_user_func_array ou, dans les versions ultérieures de PHP, enregistrez le rappel dans une variable et utilisez la syntaxe directe : $cb() ;
  3. Les objets avec un __invoke() (y compris les fonctions anonymes) entrent dans la catégorie "appelable" et peuvent être utilisées de la même manière, mais je ne les associe personnellement pas au terme "callback" hérité.
  4. L'héritage create_function() crée une fonction globale et renvoie son nom. Il s'agit d'une enveloppe pour eval() et les fonctions anonymes doivent être utilisées à la place.

0 votes

En effet, l'utilisation de la fonction est la bonne façon de procéder. Bien que l'utilisation d'une variable et le simple fait de l'appeler, comme suggéré dans la réponse acceptée, soit cool, c'est laid et ne s'adapte pas bien au code.

4 votes

Modification de la réponse acceptée. Je suis d'accord avec les commentaires, c'est une excellente réponse.

0 votes

Il serait utile pour les lecteurs venant de la programmation Python de préciser dans la réponse que 'someGlobalFunction' est en effet une fonction définie.

78voto

Bart van Heukelom Points 11977

Avec PHP 5.3, vous pouvez maintenant le faire :

function doIt($callback) { $callback(); }

doIt(function() {
    // this will be done
});

Enfin un moyen agréable de le faire. Une excellente addition à PHP, car les callbacks sont géniaux.

1 votes

Cela doit être la première réponse.

30voto

Nick Stinemates Points 5642

L'implémentation d'un callback se fait comme suit

// This function uses a callback function. 
function doIt($callback) 
{ 
    $data = "this is my data";
    $callback($data); 
} 

// This is a sample callback function for doIt(). 
function myCallback($data) 
{ 
    print 'Data is: ' .  $data .  "\n"; 
} 

// Call doIt() and pass our sample callback function's name. 
doIt('myCallback');

Affiche : Les données sont : ce sont mes données

22 votes

Oh mon dieu. C'est la norme ? C'est terrible !

0 votes

Il existe quelques autres façons de procéder, comme indiqué ci-dessus. J'ai vraiment pensé la même chose.

0 votes

Wow, cela ajoute de nouvelles tournures à la programmation conventionnelle.

9voto

yukondude Points 8756

Une astuce astucieuse que j'ai récemment découverte consiste à utiliser la fonction de PHP create_function() pour créer une fonction anonyme/lambda pour une utilisation ponctuelle. C'est utile pour les fonctions PHP comme array_map() , preg_replace_callback() o usort() qui utilisent des callbacks pour un traitement personnalisé. Cela ressemble à peu près à ce que fait un eval() sous les couvertures, mais c'est toujours une façon fonctionnelle et agréable d'utiliser PHP.

6 votes

Malheureusement, le ramasseur d'ordures ne joue pas très bien avec cette construction qui produit des fuites de mémoire potentielles. Si vous recherchez la performance, évitez create_function().

0 votes

Pourriez-vous mettre à jour la réponse avec la version PHP 7.4 (fonctions de flèche) et ajouter un avertissement sur les fonctions dépréciées ? create_function() ?

7voto

pilif Points 7172

Eh bien... avec la 5.3 à l'horizon, tout ira mieux, car avec la 5.3, nous aurons des closures et avec elles des fonctions anonymes

http://wiki.php.net/rfc/closures

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X