Comment les callbacks sont-ils écrits en PHP?Comment implémenter un callback en PHP?
Répondre
Le manuel utilise les termes « rappel » « callback » et « appelable » de façon interchangeable, mais, traditionnellement fait référence à une valeur de chaîne ou de tableau qui agit comme function pointer, faisant référence à une fonction ou à une méthode de classe pour un appel ultérieur. Cela a permis à certains éléments de la programmation fonctionnelle depuis PHP 4. Les saveurs sont:
$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');
Ceci est un moyen sûr d'utiliser des 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);
}
versions PHP modernes permettent aux trois premiers formats ci-dessus pour être appelé directement $cb()
. call_user_func
et call_user_func_array
support tout ce qui précède.
Voir: http://php.net/manual/en/language.types.callable.php
Notes/Avertissements:
- Si la fonction/classe est un espace de noms, la chaîne doit contenir le nom complet. Par exemple.
['Vendor\Package\Foo', 'method']
call_user_func
ne supporte pas le passage de non-objets par référence, donc vous pouvez soit utilisercall_user_func_array
ou, dans les versions ultérieures de PHP, enregistrer le rappel à un var et utiliser la syntaxe directe:$cb()
;- Les objets avec une méthode
__invoke()
(y compris les fonctions anonymes) entrent dans la catégorie "callable" et peuvent être utilisés de la même manière, mais personnellement, je ne les associe pas au terme "callback" hérité.L'héritagecreate_function()
crée une fonction globale et renvoie son nom. C'est un wrapper poureval()
et des fonctions anonymes devraient être utilisées à la place.
C'est largement mieux que l'auto-réponse acceptée par OP. – chaos
En effet, l'utilisation de la fonction est la bonne façon de le faire. Alors que l'utilisation d'une variable, puis simplement l'appeler, comme suggéré dans la réponse acceptée est cool, c'est moche et ne sera pas bien à l'échelle avec le code. – icco
Changé réponse acceptée. D'accord avec les commentaires, c'est une excellente réponse. –
La mise en œuvre d'un rappel est fait comme tant
// 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
Oh mon dieu. Est-ce la norme? C'est terrible! –
Il existe d'autres façons de le faire, comme indiqué ci-dessus. J'ai vraiment pensé la même chose. –
Wow, cela ajoute de nouveaux rebondissements à la programmation conventionnelle. –
Une bonne astuce que j'ai récemment trouvé est d'utiliser create_function()
PHP pour créer un anonyme/Fonction lambda pour une utilisation unique. Il est utile pour les fonctions PHP telles que array_map()
, preg_replace_callback()
ou usort()
qui utilisent des rappels pour un traitement personnalisé. Il ressemble beaucoup à un eval()
sous les couvertures, mais c'est quand même un bon moyen fonctionnel d'utiliser PHP.
Je grince chaque fois que j'utilise create_function()
en php.
Les paramètres sont une chaîne séparée par des virgules, le corps de la fonction entière dans une chaîne ... Argh ... Je pense qu'ils ne pourraient pas l'avoir rendu plus laid même s'ils ont essayé.
Malheureusement, c'est le seul choix lorsque créer une fonction nommée ne vaut pas le coup.
Et, bien sûr, c'est la chaîne d'exécution eval, donc elle n'est pas vérifiée pour la syntaxe valide ou quoi que ce soit d'autre au moment de la compilation. – hobbs
bien ... avec 5.3 à l'horizon, tout ira mieux, parce qu'avec 5.3, nous obtenons les fermetures et les fonctions anonymes
Vous voulez vérifier ce que votre appel est valable. Par exemple, dans le cas d'une fonction spécifique, vous voulez vérifier et voir si la fonction existe:
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
Que faire si le callback n'est pas une fonction mais un objet et une méthode contenant un tableau? –
ou plutôt 'is_callable ($ callback)' –
Les deux sont de bonnes suggestions - Il sera nécessaire de vérifier votre propre implémentation particulière de la façon dont vous effectuez un rappel. J'espérais mettre en garde contre l'appel de quelque chose qui n'existait pas causant un décès. J'ai fait la réponse plus générale – SeanDowney
create_function
ne fonctionnait pas pour moi dans une classe. Je devais utiliser call_user_func
.
<?php
class Dispatcher {
//Added explicit callback declaration.
var $callback;
public function Dispatcher($callback){
$this->callback = $callback;
}
public function asynchronous_method(){
//do asynch stuff, like fwrite...then, fire callback.
if (isset($this->callback)) {
if (function_exists($this->callback)) call_user_func($this->callback, "File done!");
}
}
}
Puis, à utiliser:
<?php
include_once('Dispatcher.php');
$d = new Dispatcher('do_callback');
$d->asynchronous_method();
function do_callback($data){
print 'Data is: ' . $data . "\n";
}
?>
[Modifier] Ajout d'une parenthèse manquante de. En outre, ajouté la déclaration de rappel, je le préfère de cette façon.
La classe Dispatcher ne nécessite-t-elle pas un attribut pour que $ this-> callback = $ callback fonctionne? –
@james poulson: PHP est un langage dynamique, donc ça marche. Mais j'étais paresseux. Je déclare généralement les propriétés, rend la vie de tout le monde plus facile. Votre question m'a fait regarder à nouveau ce code et repérer une erreur de syntaxe, tu. Merci – goliatone
Je ne savais pas que c'était possible. Merci d'avoir répondu :) . –
Avec PHP 5.3, vous pouvez le faire:
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
Enfin une belle façon de le faire. Un excellent ajout à PHP, car les rappels sont géniaux.
assez soigné, c'est très utile – Ulterior
Pour ceux qui ne se soucient pas de rompre la compatibilité avec PHP < 5.4
, je suggérerais d'utiliser l'indication de type pour faire une implémentation plus propre.
function call_with_hello_and_append_world(callable $callback)
{
// No need to check $closure because of the type hint
return $callback("hello")."world";
}
function append_space($string)
{
return $string." ";
}
$output1 = call_with_hello_and_append_world(function($string) { return $string." "; });
var_dump($output1); // string(11) "hello world"
$output2 = call_with_hello_and_append_world("append_space");
var_dump($output2); // string(11) "hello world"
$old_lambda = create_function('$string', 'return $string." ";');
$output3 = call_with_hello_and_append_world($old_lambda);
var_dump($output3); // string(11) "hello world"
- 1. Comment implémenter is_empty() en PHP?
- 2. Comment implémenter le routage URL en PHP
- 3. Comment pourrait-on implémenter un index forward en PHP?
- 4. Comment puis-je implémenter un moteur de balises en PHP?
- 5. .NET Remoting callback
- 6. Comment implémenter la pagination via JQuery en PHP?
- 7. Comment puis-je implémenter commit/rollback pour MySQL en PHP?
- 8. comment implémenter un système de login sous php?
- 9. Comment implémenter l'intervalle "Member for" comme SO en PHP?
- 10. Comment implémenter une telle fonction callcenter en PHP?
- 11. Comment implémenter un singleton en C#?
- 12. comment implémenter php connexion ou session d'authentification
- 13. Comment implémenter P2P en C#?
- 14. Comment implémenter l'OO en Javascript en utilisant un framework prototype?
- 15. Comment implémenter OpenID en Java
- 16. Que fait une déclaration "CALLBACK" en C?
- 17. C# callback de DLL
- 18. Comment implémenter un événement annulable?
- 19. WCF canal Callback
- 20. Dans ActiveRecord, comment utiliser 'changed' (dirty) dans un callback before_save?
- 21. Comment implémenter plusieurs langues dans une application PHP?
- 22. C Timer Callback
- 23. Client TCP Callback asynchrone
- 24. Comment implémenter le routage d'URL avec PHP + IIS?
- 25. Comment implémenter quicksort en utilisant un fichier batch?
- 26. Comment implémenter un intercepteur d'audit en utilisant iBATIS?
- 27. Comment implémenter la pagination en utilisant un tableau HTML?
- 28. Callback et asp.net gridview
- 29. ignorer after_update callback
- 30. Est-ce qu'un callback 'invoke' est possible en PHP5?
Cette "question" pourrait utiliser beaucoup plus de détails. Des réponses utiles, cependant! – rinogo