Maison >développement back-end >tutoriel php >Comment appeler correctement les fermetures attribuées aux propriétés d'objet en PHP ?
Invoquer des fermetures attribuées directement aux propriétés d'un objet
L'attribution d'une fermeture à la propriété d'un objet permet aux développeurs d'associer des fonctionnalités à l'objet. Cependant, accéder directement à la fermeture peut être problématique.
Le problème :
Lorsque vous tentez d'invoquer directement une fermeture attribuée à une propriété d'objet, l'erreur suivante se produit :
Fatal error: Call to undefined method stdClass::callback().
C'est parce que la propriété est stockée en tant qu'objet de fermeture, qui n'a pas de __invoke() méthode.
Solution en PHP 7 et supérieur :
À partir de PHP 7, la syntaxe suivante est disponible :
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Alternativement, Closure ::call() peut être utilisé, bien que cela ne fonctionne pas avec StdClass :
Closure::call($obj->callback, ['World']);
Solution avant PHP 7 :
Avant PHP 7, la méthode magique __call peut être implémentée pour intercepter les invocations de 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 : La méthode __call ne peut pas utiliser call_user_func_array(array($this, $method), $args) car cela conduirait à une boucle 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!