Maison >développement back-end >tutoriel php >Pourquoi ne puis-je pas appeler directement la propriété de fermeture d'un objet en PHP et comment puis-je y remédier ?
Appeler directement la fermeture de la propriété d'un objet
Lors de l'attribution d'une fermeture à la propriété d'un objet, vous pouvez rencontrer des difficultés pour l'appeler directement sans réaffecter la fermeture à une variable. Prenons l'exemple suivant :
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; };
Malheureusement, tenter d'appeler $obj->callback() entraînera l'erreur "Erreur fatale : appel à une méthode non définie stdClass::callback()".
Solution PHP 7
En PHP 7, en utilisant les fonctions fléchées (introduites en PHP 7.4), vous pouvez directement invoquer une fermeture affectée à la propriété d'un objet comme suit :
$obj = new StdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Closure::call()
Pour les versions de PHP inférieures à 7 , une alternative consiste à utiliser la fonction Closure::call(). Cependant, cette méthode n'est pas applicable aux instances StdClass.
Méthode Magic __call
Avant PHP 7, une approche viable consistait à implémenter la méthode magic __call, qui permet d'intercepter appels à des méthodes non définies. Dans l'exemple suivant, une classe Foo est créée avec une implémentation __call :
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');
Notez que l'implémentation __call évite la récursivité infinie en empêchant l'appel de la même méthode dans le corps __call.
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!