2011-10-28 2 views
1

Ceci est en quelque sorte une suite à une question précédente - mais j'ai distillé la question et ai les cas "fonctionne" contre "ne fonctionne pas" rétréci beaucoup plus précisément.PHP create_function Variable d'instance - Impossible d'appeler la fonction anonyme: Suivi

Mon objectif: J'ai une classe MyClass qui a une variable d'instance myFunction. Lors de la création d'un objet MyClass (instanciation), le constructeur affecte la variable d'instance myFunction au résultat d'un appel à create_function (où le code et les arguments proviennent d'un appel db).

Une fois cet objet de type MyClass est créé (et stocké comme une variable d'instance d'une autre classe ailleurs) Je veux être en mesure d'appeler myFunction (l'instance fonction anonyme variable) de « nulle part » que j'ai l'objet MyClass.


cas expérimentaux - ci-dessous est mon code de test très simplifié pour illustrer ce qui fonctionne par rapport à ce qui ne fonctionne pas (lorsque les sauts de fonctionnalités attendues)

class MyClass extends AnotherClass { 

    public $myFunction; 

    function __construct() { 

     $functionCode = 'echo "NyanNyanNyan";'; 

     $this->myFunction(); 

     /*Now the following code works as expected if put in here for testing*/ 
     $anonFunc = $this->myFunction; 
     $anonFunc(); //This call works just fine (echos to page)! 

     /*And if i make this call, it works too! */ 
     self::TestCallAnon();  

    } 

    public function TestCallAnon() { 

      $anonFunc2 = $this->myFunction; 
      $anonFunc2(); 
    } 

} 

Cependant, si je les éléments suivants (dans un autre fichier, il dit des erreurs undefined function() dans ... dans le journal des erreurs Apache.

//I'm using Yii framework, and this is getting the user 
//objects instance variable 'myClass'. 

$object = Yii::app()->user->myClass; 

$object->TestCallAnon(); // **FAILS** 

ou

$func = $object->myFunction; 
$func(); // ** ALSO FAILS ** 

En outre, plusieurs variantes d'appels à call_user_func et call_user_func_array ne fonctionnent pas.

Si quelqu'un est en mesure d'offrir un aperçu ou de l'aide qui serait génial :).

Merci d'avance!

Répondre

0

Je fini par résoudre ce problème par une solution qui a fini par être un meilleur choix de toute façon. En fin de compte, j'ai fini par avoir une classe statique qui avait une méthode pour retourner aléatoirement l'un des identifiants possibles, puis une autre méthode qui acceptait cet identifiant pour construire la fonction anonyme sur chaque classe.

Un peu moins élégant que je ne le voudrais, mais ça finit par bien fonctionner.

Merci à tous pour vos efforts.

1

Vous ne pouvez pas passer des références aux fonctions autour de PHP comme vous pouvez le faire par exemple pour JavaScript.

call_user_func a des fonctionnalités limitées. Vous pouvez l'utiliser comme ceci:

class MyClass { 
    function func() {} 
    static function func() {} 
} 
function myfunc() {} 

$i = new MyClass(); 

call_user_func("myfunc", $args); 
call_user_func(array($i, "func"), $args); 
call_user_func(array(MyClass, "staticFunc"), $args); 
+0

Salut merci pour votre suggestion. J'ai essayé 'call_user_func (array ($ object, $ funcName), array())' sans succès. Ce sont des erreurs qui disent que les comportements n'ont pas de méthode ou de fermeture nommée "". ', Ce qui implique que $ funcName est vide je suppose? Mais quand j'écho $ funcName une ligne au-dessus de ça, ça me donne "lambda_3". – csjohn

+0

Cela ne ressemble pas à l'erreur PHP que vous obtiendriez de 'call_user_func'. – Halcyon

Questions connexes