Maison >développement back-end >tutoriel php >Comment appeler directement les fermetures affectées aux propriétés d'objet en PHP ?
Invoquer directement des fermetures affectées aux propriétés d'un objet
En PHP, les fermetures affectées aux propriétés d'un objet ont des limites lorsqu'on tente de les invoquer directement. Comme démontré dans le code fourni :
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();
Ce code échoue avec l'erreur "Erreur fatale : appel à la méthode non définie stdClass::callback()." Pour résoudre ce problème, PHP 7 a introduit une méthode d'invocation directe.
PHP 7 et versions ultérieures
Dans PHP 7 et versions ultérieures, vous pouvez appeler des fermetures affectées aux propriétés d'objet directement en utilisant la syntaxe suivante :
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Pré-PHP 7
Avant PHP 7, il n'était pas possible d'invoquer directement les fermetures affectées aux propriétés d'un objet. Au lieu de cela, vous deviez implémenter la méthode magique __call pour intercepter l'appel et invoquer la fermeture :
class Foo { public function __call($method, $args) { if(is_callable(array($this, $method))) { return call_user_func_array($this->$method, $args); } // else throw exception } } $foo = new Foo; $foo->cb = function($who) { return "Hello $who"; }; echo $foo->cb('World');
Remarque : Dans __call, il est crucial d'éviter d'appeler call_user_func_array(array($this , $méthode), $args); car cela déclenchera une récursion infinie.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!