8
votes

call_user_func_array vs. call_user_funcunc

J'ai couru sur une question intéressante aujourd'hui. Nous avons une application qui utilise la fonctionnalité de mise en cache Zend-cadre. Une demande à cette application appelle typiquement une méthode d'usine à l'aide de la ligne suivante

$result =  call_user_func(array("myclass", "factory"), $id);


1 commentaires

J'ai récemment remarqué ce problème tout en convertissant tout mon code pour utiliser des espaces de noms. La classe existe bien et je peux instancer des instances. Mais lorsque je prends des instances et essayez d'appeler une méthode sur celle-ci en utilisant soit _array ou non, rien ne se passe. Le code continue, mais la méthode ne semble jamais être appelée.


3 Réponses :


0
votes

Quelle version de PHP utilisez-vous? Il y avait un problème dans la combinaison de call_user_func_array avec réflectionclass à un moment donné. Je ne sais pas si c'est réparé encore.


1 commentaires

Je suis sûr que la question dont je parle est plus âgée que cela.



0
votes

est-ce segfaulting? Vérifiez vos journaux d'apache 'root' (en dehors de tout virtualhost) et voyez ce qui se passe. Si ce fil est SEGFaulting, vous voudrez peut-être persuader que sur les listes de diffusion PHP et / ou le suivisseur de bugs.

Alternativement, vous pouvez essayer d'exécuter HTTP en mode utilisateur unique, dans GDB, avec une compilation de débogage de PHP et voir si vous pouvez le capturer, mais c'est beaucoup de travail: -)


3 commentaires

J'ai nettoyé toutes mes journaux et il n'y a aucune indication que Apache segfaulting. J'aurais aimé avoir le temps de déboguer Apache en mode utilisateur unique.


Attendez ... Vérifiez que ... c'est SEGFAULT. Off à PHP je vais.


J'ai rencontré des SEGFAULTS difficiles à déboguer dans PHP lorsque vous utilisez AutoLoading pour mes cours. Fondamentalement, certaines fonctions ne déclenchent pas l'autochargeur si une classe n'existe pas, ne jetez même pas une erreur fatale et procédez à un abandon téméraire. Un bon exemple consiste à utiliser méthod_exists () avec une chaîne représentant un nom de classe qui n'a pas encore été inclus == Segfault.



2
votes

J'ai eu des problèmes comme celui-ci qui est tombé à __AutoLoad ne pas tirer correctement lorsqu'une classe non encore chargée a été invoquée via une commande PHP. Aucune autre stratégie que l'essai stupide et l'erreur pour cela, essayez simplement si une ligne invoque explicitement la classe avant que la commande PHP ne la résout pour vous.

$dummy = new MyClassName;
call_user_func_array(array('MyClassName', 'method'), array($id));
unset($dummy);


2 commentaires

Ma théorie va que call_user_func_array est un peu plus téméraire (faute d'un meilleur terme) lorsque vous essayez de faire appel à l'appel. Il serait intéressant de voir la source des deux fonctions pour les comparer. Je vais soumettre un rapport de bogue à PHP pour ce problème et voir ce qu'ils disent.


Appelant __ autoload directement ou au moins class_existes (avec le second param param Wrad, qui est la valeur par défaut) serait un moyen moins cher de déclencher l'autochargeur. De cette façon, vous ne gaspillez pas la mémoire instanciant d'une instance de la classe.