Когда (если вообще когда-либо) это не зло? - PullRequest
26 голосов
/ 17 августа 2010

Я слышал много мест , что PHP eval функция часто не является ответом . В свете PHP 5.3 5.3 LSB и замыканий у нас заканчиваются причины зависеть от eval или create_function.

Существуют ли какие-либо мыслимые случаи, когда eval является лучшим (единственным?) Ответом в PHP 5.3?

Этот вопрос не о том, является ли eval злом вообще, как, очевидно, нет.

Сводка ответов:

  • Оценка числовых выражений (или других «безопасных» подмножеств PHP)
  • Модульное тестирование
  • Интерактивная PHP "оболочка"
  • Десериализация доверенных var_export
  • Некоторые языки шаблонов
  • Создание бэкдоров для администраторов и / или хакеров
  • Совместимость с
  • Проверка синтаксиса (возможно, небезопасного)

Ответы [ 15 ]

0 голосов
/ 09 ноября 2010

Не прямое использование, но модификатор / e для preg_replace использует eval и может быть весьма полезен. См. Пример № 4 на http://php.net/preg_replace.

Является ли это злом / злом субъективно и целиком и полностью зависит от того, что вы считаете «хорошим» в конкретном контексте. При работе с ненадежными данными это обычно считается плохим. Однако в других ситуациях это может быть полезно. Представьте, что вы пишете сценарий одноразового преобразования данных в условиях крайнего крайнего срока. В этой ситуации, если eval работает и делает вещи проще, мне было бы трудно назвать это злом.

0 голосов
/ 06 ноября 2010

Эти дебаты на самом деле - одно большое недоразумение в контексте php.Людям промывают мозги о том, что все они злые, но обычно у них нет проблем с использованием include, хотя include - это по сути одно и то же.Включать foo - это то же самое, что и eval file_get_contents foo, поэтому каждый раз, когда вы включаете что-то, вы совершаете смертный грех eval.

0 голосов
/ 06 ноября 2010

Таким образом, это должно быть справедливо для всех языков с eval:

По сути, за немногими исключениями, если вы создаете значение, переданное eval, или получаете его из источника без правдивостиделают что-то не так.То же самое верно, если вы вызываете eval для статической строки.

Помимо проблем с производительностью при инициализации синтаксического анализатора во время выполнения и проблем с безопасностью, вы, как правило, путаетесь с системой типов.Более серьезно, только что было показано, что в подавляющем большинстве случаев существуют гораздо более элегантные подходы к решению.Однако, вместо того, чтобы полностью запретить конструкцию, приятно думать о ней как о goto.Существуют законные варианты использования обоих, но это хороший красный флаг, о котором следует подумать, если вы подходите к проблеме правильно.

По моему опыту, я нашел только законные варианты использования, которые попадают вкатегории плагинов и привилегированный пользовательский (например, администратор веб-сайта, а не пользователь таких) расширений.В основном вещи, которые действуют как код, поступающий из надежных источников.

0 голосов
/ 05 ноября 2010

Я использовал eval, когда у меня был php-движок, который общался со мной, и я мог сказать ему делать команды через EVAL: php commands here.Все еще зло, но если ваш код не знает, чего ожидать (если вы извлекаете кусок PHP-кода из базы данных), eval - единственное решение.

0 голосов
/ 05 ноября 2010

Совместимость .Довольно часто можно использовать запасные варианты PHP4.Но также возможно желание эмулировать функциональность PHP5.4 в 5.3, как пример SplString.В то время как простое предоставление двух вариантов включения (include.php4 и include.php5) часто, иногда эффективнее или удобочитаемее прибегнуть к eval ():* работать на PHP4, но выставлять более приятный API / синтаксис только на PHP5.Обратите внимание, что пример вымышленный.

...