2010-06-13 7 views
0

J'utilise un hack ge_called_class pour permettre la liaison statique tardive dans php version 5.2 (trouvé here).get_called_class pirater ne fonctionne pas avec eval-code

je suit dans mon code:

# db_record.php 
$ac = "ForumThread"; 
$objects = $ac::find("all"); 

Cela ne fonctionnera pas en php 5.2 pour une raison quelconque, j'ai donc fait cela:

# db_record.php 
$ac = "ForumThread"; 
eval("\$objects = {$ac}::find('all');"); 

Ce d'autre part ne sera pas fonctionne avec la fonction get_called_class. J'obtiens une erreur que la fonction file ne peut pas lire la section evaled du code.

Répondre

0

Si vous utilisez eval, votre solution est incorrecte.

Pourquoi votre version non-eval ne fonctionnera-t-elle pas? Qu'est-ce qui ne va pas? Quel est le message d'erreur complet et complet?

La version fournie par l'utilisateur de get_called_class effectue une opération de retour et tente d'ouvrir le fichier de l'appelant pour déterminer le nom de la classe. La raison pour laquelle eval échoue est que le backtrace eval ne fournit pas de nom de fichier.

(Edit: aussi que get_called_class hack est bien un hack Y at-il une raison que vous ne pouvez pas utiliser 5.3.?)

Avez-vous essayé d'utiliser call_user_func? call_user_func(array($ac, 'find'), 'all')doit appeler la méthode statique find pour le nom de classe contenu dans $ac avec le paramètre 'all'. Voir aussi le callback pseudo-type, and the "Type 2" example in specific

+0

Je suis entièrement d'accord qu'il ne devrait pas être nécessaire d'utiliser 'eval' mais il arrive que cela fonctionne sur ma propre boîte avec PHP 5.3, mais pas sur le serveur avec 5.2. Son exécution déclenchera cette erreur: Parse error: syntax error, T_PAAMAYIM_NEKUDOTAYIM inattendue /home/virtual/atanea.dk/vendor/framework/lib/db_record.php en ligne 89 Erreur fatale: Appel à une assign fonction membre() sur un non-objet dans /home/virtual/atanea.dk/vendor/framework/lib/action_view.php sur la ligne 87' – Ekampp

+0

Et pourquoi je n'utilise pas 5.3 est parce que mon hébergeur ne supporte pas encore avec l'argument que c'est encore instable. Donc je suis obligé de faire tous les hacks. – Ekampp

+0

Toujours instable? Il a été sorti pendant un an ce mois-ci. Votre hôte en est plein. En ce qui concerne l'erreur, avez-vous essayé d'utiliser call_user_func? 'call_user_func (array ($ ac, 'find'), 'all')' * devrait * appeler la méthode statique 'find' pour le nom de classe contenu dans' $ ac' avec le paramètre '' all ''. (Cela a été intégré dans ma réponse.) – Charles

Questions connexes