Лично я считаю, что этот код по-прежнему довольно злой, потому что вы не комментируете то, что он делает. Он также не проверяет свои входные данные на достоверность, что делает его очень хрупким.
Я также считаю, что, поскольку 95% (или больше) случаев использования eval являются активно опасными, небольшая потенциальная экономия времени, которую он может обеспечить в других случаях, не стоит того, чтобы отказываться от плохой практики его использования. Кроме того, позже вам придется объяснять своим миньонам, почему вы используете eval, а они - плохо.
И, конечно же, ваш PHP выглядит как Perl;)
Есть две ключевые проблемы с eval () (как сценарий "инъекционной атаки"):
1) Это может причинить вред 2) Может просто вылететь
и более социальный, чем технический:
3) Это будет соблазнять людей использовать его ненадлежащим образом в качестве ярлыка в другом месте
В первом случае вы рискуете (очевидно, не когда вы оцениваете известную строку) выполнения произвольного кода. Однако ваши входные данные могут быть не такими известными или фиксированными, как вы думаете.
Скорее всего (в этом случае) вы просто упадете, и ваша строка закончится неоправданно непонятным сообщением об ошибке. IMHO, весь код должен выходить из строя настолько аккуратно, насколько это возможно, в противном случае он должен вызывать исключение (как наиболее управляемую форму ошибки).
Я бы предположил, что в этом примере вы кодируете случайно, а не кодируете поведение. Да, оператор перечисления SQL (и вы уверены, что перечисление этого поля? - вы вызывали правильное поле правильной таблицы правильной версии базы данных? Действительно ли он ответил?) Выглядит как синтаксис объявления массива в PHP, но я бы посоветовал вам действительно не найти кратчайшего пути от ввода к выводу, а скорее заняться указанной задачей:
- Определите, что у вас есть перечисление
- Извлеките внутренний список
- Распаковать значения списка
Это примерно то, что делает ваш вариант, но я бы обернул некоторые if и комментарии вокруг него для ясности и безопасности (например, если первое совпадение не совпадает, выбросить исключение или установить нулевой результат).
По-прежнему существуют некоторые возможные проблемы с экранированными запятыми или кавычками, и вам, вероятно, следует распаковать данные, а затем исключить их из кавычек, но он, по крайней мере, обрабатывает данные как данные, а не как код.
С preg_version ваш худший результат, вероятно, будет $ result = null, с версией eval худший неизвестен, но по крайней мере сбой.
$result = array(); preg_replace_callback('#^enum\s*\(\s*\'|\'\s*\)\s*$#', function($m) use($result) { $result[] = $m[1]; }, $type);