Maison >développement back-end >tutoriel php >Comment appeler directement les fermetures affectées aux propriétés d'objet en PHP ?

Comment appeler directement les fermetures affectées aux propriétés d'objet en PHP ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 17:28:11936parcourir

How to Directly Invoke Closures Assigned to Object Properties in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn