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

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

DDD
Libérer: 2024-12-22 11:23:10
original
471 Les gens l'ont consulté

How to Correctly Invoke Closures Assigned to Object Properties in 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().
Copier après la connexion

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');
Copier après la connexion

Alternativement, Closure ::call() peut être utilisé, bien que cela ne fonctionne pas avec StdClass :

Closure::call($obj->callback, ['World']);
Copier après la connexion

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');
Copier après la connexion

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!

Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal