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 ?

Pourquoi ne puis-je pas appeler directement la propriété de fermeture d'un objet en PHP et comment puis-je y remédier ?

DDD
DDDoriginal
2024-12-17 18:30:10357parcourir

Why Can't I Directly Call an Object's Closure Property in PHP, and How Can I Fix It?

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!

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