Personnellement, je pense que ce code est encore assez mauvais parce que vous ne commentez pas ce qu'il fait. Il ne teste pas non plus la validité de ses entrées, ce qui le rend très fragile.
Je pense également que, puisque 95% (ou plus) des utilisations d'Eval sont activement dangereuses, le petit gain de temps potentiel qu'il pourrait fournir dans d'autres cas ne vaut pas la peine de se livrer à la mauvaise pratique de l'utiliser. De plus, vous devrez plus tard expliquer à vos serviteurs pourquoi votre utilisation d'Eval est bonne et la leur mauvaise.
Et, bien sûr, votre PHP finit par ressembler à Perl;)
Il y a deux problèmes clés avec eval (), (comme un scénario "d'attaque par injection"):
1) Cela peut causer des dommages 2) Il peut simplement s'écraser
et un qui est plus social que technique:
3) Cela incitera les gens à l'utiliser de manière inappropriée comme raccourci ailleurs
Dans le premier cas, vous courez le risque (évidemment, pas lorsque vous évaluez une chaîne connue) de l'exécution de code arbitraire. Cependant, vos entrées peuvent ne pas être aussi connues ou aussi fixes que vous le pensez.
Plus probablement (dans ce cas) vous ne ferez que planter, et votre chaîne se terminera par un message d'erreur gratuit et obscur. À mon humble avis, tout le code doit échouer aussi proprement que possible, faute de quoi il doit lancer une exception (comme la forme d'erreur la plus gérable).
Je suggérerais que, dans cet exemple, vous codez par coïncidence plutôt que par comportement. Oui, l'instruction SQL enum (et êtes-vous sûr que l'énumération de ce champ? - avez-vous appelé le bon champ de la bonne table de la bonne version de la base de données? mais je suggérerais que ce que vous voulez vraiment faire n'est pas de trouver le chemin le plus court de l'entrée à la sortie, mais plutôt de vous attaquer à la tâche spécifiée:
- Identifiez que vous avez une énumération
- Extraire la liste intérieure
- Décompressez les valeurs de la liste
Ce qui est à peu près ce que fait votre option, mais j'envelopperais quelques if et des commentaires pour plus de clarté et de sécurité (par exemple, si la première correspondance ne correspond pas, lancez une exception ou définissez un résultat nul).
Il y a encore des problèmes possibles avec des virgules ou des guillemets, et vous devriez probablement décompresser les données puis les retirer, mais cela traite au moins les données comme des données, plutôt que comme du code.
Avec la version preg_version, votre pire résultat sera probablement $ result = null, avec la version eval, le pire est inconnu, mais au moins un crash.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);