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
443 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!

source:php.cn
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