Лично я думаю, что код все еще довольно злой, потому что вы не комментируете, что он делает. Он также не проверяет свои входные данные на достоверность, что делает его очень хрупким.
Я также чувствую, что, поскольку 95% (или более) видов использования eval активно опасны, небольшая потенциальная экономия времени, которую он может обеспечить в других случаях, не стоит потворствовать плохой практике его использования. Кроме того, вам позже придется объяснить своим миньонам, почему вы используете eval хорошо, а они - плохо.
И, конечно, ваш PHP выглядит как Perl;)
Есть две ключевые проблемы с eval (), (как сценарий "инъекционной атаки"):
1) Может причинить вред
2) Может просто сбой
и более социально-технический:
3) Люди будут соблазнительно использовать его в качестве ярлыка в другом месте
В первом случае вы рискуете (очевидно, не когда вы проверяете известную строку) выполнения произвольного кода. Однако ваши входные данные могут быть не такими известными или фиксированными, как вы думаете.
Скорее всего (в этом случае) вы просто аварийно завершите работу, и ваша строка прекратится с совершенно неясным сообщением об ошибке. ИМХО, весь код должен давать сбой настолько аккуратно, насколько это возможно, в противном случае он должен генерировать исключение (как наиболее поддающаяся обработке форма ошибки).
Я бы предположил, что в этом примере вы кодируете по совпадению, а не по поведению. Да, оператор перечисления SQL (и вы уверены, что перечисление этого поля? - вы называли правильное поле правой таблицы нужной версии базы данных? Он действительно отвечал?) Выглядит как синтаксис объявления массива в PHP, но я бы посоветовал вам не искать кратчайший путь от ввода к выводу, а решить указанную задачу:
- Укажите, что у вас есть перечисление
- Извлечь внутренний список
- Распаковать список значений
Это примерно то, что делает ваш вариант, но я бы обернул некоторые if и прокомментировал его для ясности и безопасности (например, если первое совпадение не совпадает, выдает исключение или устанавливает нулевой результат).
Есть еще некоторые возможные проблемы с экранированными запятыми или кавычками, и вам, вероятно, следует распаковать данные, а затем удалить их из кавычек, но они по крайней мере обрабатывают данные как данные, а не как код.
С preg_version ваш худший результат, вероятно, будет $ result = null, а с версией eval худший неизвестен, но, по крайней мере, вылетает.