Quelle est la variante de la fonction eval?
- Je utiliser eval()
dans mon projet actuel, comme ceci:
if (class_exists($class_name)) //$class_name depends on user input
eval($class_name.'::MyStaticMethod()');
eval()
est exécutée si et seulement si la classe avec le nom $class_name
existe donc, c'est un peu fort, mais je ne pense pas que ce soit la meilleure solution.
Puis-je faire la même chose que le code ci-dessus n'est sans eval()
?
Vous devez vous connecter pour publier un commentaire.
J'ai récemment répondu à cette question. La dernière partie de ma réponse parfaitement réponses à cette question et il est beaucoup plus utile pour les futurs lecteurs que les réponses fournies ici. C'est pourquoi je réponds à ma propre question.
PHP possède des caractéristiques qui donne la possibilité d'éviter l'utilisation de
eval
dans la plupart des cas:PHP est très dynamique de la langue. Il a la capacité de faire à la suite des choses avec
chaînes de caractères
:Définir et/ou variable (pris en charge à partir de PHP 4.3). Par exemple:
Démo
La fonction d'appel (prise en charge à partir de PHP 4.3). Par exemple:
Démo
Créer une instance de la classe (prise en charge à partir de PHP 5.0). Par exemple:
Démo
Appeler la méthode statique (pris en charge à partir de PHP 5.0). Par exemple:
Démo
Et à partir de PHP 5.3 nom de la classe peut également être défini par chaîne. Exemple:
Démo
Appel de la méthode d'instance de l'objet (pris en charge à partir de PHP 5.0). Par exemple:
Démo
Accès statique et des propriétés d'une instance de l'objet (pris en charge à partir de PHP 5.0). Par exemple:
Démo
call_user_func
etcall_user_func_array
pour fonction dynamique/les appels de méthode. Les deux sont parfaitement documentés donc je ne rentrerai pas dans les détails ici.Réflexion
API. Malheureusement, la documentation a quelques exemples, mais la réflexion est assez grand sujet à couvrir ici. En gros, C'est pas un gros problème pour utiliser la réflexion après la lecture de la façon dont il fonctionne.Je vous suggère de
call_user_func
.Une alternative à
call_user_func()
serait de l'appeler comme ceci:oui:
De PHP 5.3+,
Adisory:
userinput + eval = trou de sécurité;
Aussi eval est une opération coûteuse, nécessitant l'analyse de la chaîne de l'action format (arbre d'analyse, arbre de syntaxe abstraite, etc.) et de l'exécution de la nouvelle logique.
Vous ne voulez pas eval chaque petite friandise de code. Utiliser la fonction eval si vous avez quelque chose à mâcher ou plutôt de cette logique quelque part où il est réutilisable et paramétrés comme une fonction.
Aussi de php 5.4
eval
n' pas créer un nouveau processus. La preuve:<?php echo getmypid() . "\n"; eval('echo getmypid() . "\\n";');