Чем плох eval()?

Malcolm_Reed

Новичок
Чем плох eval()?

Вот много раз уже слышал не лестный отзывы об этой функции. Мол нормальные программисты евалом не пользуются, и т.д. и т.п.
Хотелось бы услышать от проффи - в чем же все таки заключается недостаток функции7 чем он так плох? Только желательно услышать ответ "по пунктам" (ну даже если он там один ;) ).
 

Vladson

Сильнобухер
Пункт всего один, функция почти бесполезна, а при неграмотном использовании ещё и опасна...
 

hermit_refined

Отшельник
1. Он не нужен.
2. Запутывает логику скрипта и значительно затрудняет его чтение и понимание человеком (а для него, в первую очередь, скрипт и пишется).
3. Очень опасен - при инъекции соответственно позволяет выполнить любой php-код.
4. Неэффективен с т.зр. производительности.
 

1Pavel1

Новичок
Eval() - это дыра в защите, можете обойти - обойдите, не можете - проверьте все входные данные и используйте.
 

magic

lancer
> Чем плох eval()?
Вопрос неправильный.

Степень плохости eval(), как и любой другой функции прямо пропорциональна кривости рук.

Спросите заодно, чем плох fdisk или format c:
 

hermit_refined

Отшельник
LeaetherStrip
Ну не надо, goto как раз иногда очень кстати. Имеющийся на данный момент в php его аналог - "break число;" намного более уродлив.
Но в PHP 6 должно быть удобнее.
 

SiMM

Новичок
> goto как раз иногда очень кстати
http://phpclub.ru/faq/goto
> Имеющийся на данный момент в php его аналог - "break число;" намного более уродлив
Это не аналог.
> Но в PHP 6 должно быть удобнее.
Неужто goto появится?
 

hermit_refined

Отшельник
http://phpclub.ru/faq/goto
Эта статья - лишь подтверждение того, что "война" ещё не закончилась. Совершенно очевидно, что есть случаи, когда goto как раз вносит ясность и избавляет от кучи лишнего кода - особенно в PHP 4, в котором нет исключений. А ими, кстати, код можно запутать похлеще, чем goto - последний хотя бы в пределах функции передаёт исполнение.
Иными словами, дело всё-таки не в конструкциях, но в разумном их использовании.
Обычно пользуется там, где в C использовался бы goto, и придумывался именно из желания избежать "знаменитого" оператора.
Неужто goto появится?
Почти он - break с меткой, ограниченный goto, позволяющий переходить только "вперёд". В TODO, между прочим, так и написано, что обозвали его break, дабы не смущать людей.
 

Gorynych

Посетитель PHP-Клуба
Vladson
функция почти бесполезна
hermit_refined
а Вы можете показать другой вариант, кроме
PHP:
eval("\$obj = $className::getInstance();");
получения экземпляра класса-одиночки (singleton) по имени этого класса?

P.S. практически это действие нужно для фабрики классов :)
 

Alexandre

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

видел два вида использования eval() в построении шаблонизатора.
плюс - простота,
минус - это скорость.
 

Gorynych

Посетитель PHP-Клуба
hermit_refined

на самом деле спасибо. А то уперся в то, что для
PHP:
mixed call_user_method_array ( string method_name, object &obj, array paramarr )
нужен объект и по старинке eval'юсь, вместо такого приятного вызова через
PHP:
array(имя_класса,имя_метода)
 

Gorynych

Посетитель PHP-Клуба
hermit_refined да и фиг с ним. Я уже поменял на
PHP:
if ( in_array('getInstance', get_class_methods($className)) ) {
    $obj = "$className";
} else {
    $obj = new $className;
}
call_user_func_array( array($obj, $method), $options);
- просто это был довольно старый код, из давно не обновлявшихся потрохов (работает - оставь как было и ничего не трогай :)
 

Gorynych

Посетитель PHP-Клуба
SiMM исключительно для улучшения читабельности того факта, что в $obj загоняем строковое значение.

Т.е. в принципе - не нафига. Но через несколько месяцев мне и остальным так будет проще читать код, если он будет пересматриваться :)
 

whirlwind

TDD infected, paranoid
Gorynych есть более корректный метод http://en.wikipedia.org/wiki/Factory_method_pattern
 
Сверху