include vs eval

young

Новичок
include vs eval

Возникла бредовая мысль:

Есть ли принципиальная разница между include и eval?

Имхо нет

И если таки нет то почему include все используют а eval все ругают?
 

zahhar

двинутый новичок
Если бы разницы не было, в мане была бы ссылка с одной ф-ции на другую.

Для начала, eval() - это ф-ция, а include() - языковая конструкция, eval() не предназначена для включения и исполнения кода, находящегося в другом файле ну и т.д.
 

young

Новичок
да это те же яйца, по крайней мере с виду

include - выполняет код взятый из указанного файла
eval - выполняет код, переданный как аргумент

Они взаимозаменяемы

include(file) == eval(file_get_content(file))

Для начала, eval() - это ф-ция, а include() - языковая конструкция
Это да, но что из этого следует?
 

Oleg Marchuk

Человек
http://us2.php.net/manual/en/function.eval.php

Можем пройтись по коментариям, если хочешь.

Итак:
Плохой стиль - не очевидно, что происходит в eval и откуда оно берется
Нарушает концепцию структурного прграммирования
Не работает, как ожидается с переменными и конструкциями (break, continue, globals)
Не работает с сылками
Возвращает false при не удаче
Плохо отлаживать код
Проблема безопасности: в eval передается переменная. Если ты ее еще и строишь, основываясь на внешних данных - капец тебе :) Мне извесны люди, которые пишут код и оставляют после себя такие backdoor (для контроля оплаты).
 

zahhar

двинутый новичок
Думаю, производительность include(file) vs eval(file_get_content(file)) будет эффективнее у первого решения.

Сюда же про разницу между конструкуийе и ф-цией. Я не силён в архитектуре языков программирования, поэтому если кто вразумительно исполкует - тому респект, но сам я понимаю разницу так: логика языковой конструкции реализована на более низком уровне (ближе к ядру компилятора/интерпретатора), чем ядро ф-ции и поэтому языковые конструкции должны бы исполняться быстрее ф-ций.

-~{}~ 22.07.04 17:53:

А использование eval() для создания бэкдора - это ход, да!
 

young

Новичок
Не работает, как ожидается с переменными и конструкциями (break, continue, globals)
гм.
а если у нас внутри цикла include внутри которого break он отработает так как ожидается?
 

Oleg Marchuk

Человек
[strike]Вечный цикл[/strike] Фатал:
PHP:
while(1) {
    eval('break;');
}
-~{}~ 22.07.04 17:58:

Все как надо:

PHP:
eval('while(1) { echo "ok"; break; }');
 

neko

tеam neko
интересно по каким признакам хоть какие-нибудь треды оставляют в этом разделе

я так понял, членам клуба тут можно любые бредовые вопросы задавать, остальные же отсюда выносятся сразу же

young

насчет циклов речь идет о том
PHP:
	for( $a = 0; $a < 5; $a++ )
	{
		eval( 'break;' );
	}
эквивалентно
PHP:
	for( $a = 0; $a < 5; $a++ )
	{
		{
			break;
		}
	}
т.е. будет фатал еррор
 

young

Новичок
Проблема безопасности: в eval передается переменная. Если ты ее еще и строишь, основываясь на внешних данных - капец тебе Мне извесны люди, которые пишут код и оставляют после себя такие backdoor (для контроля оплаты).
А использование eval() для создания бэкдора - это ход, Плохой код можно написать и как с include так и с eval
использование переменных в имени файла - точно такой же backdoor
 

Oleg Marchuk

Человек
neko
Согласен :) Провтыкал

-~{}~ 22.07.04 18:06:

neko
И все-таки, не эквивалентно. Так тоже не работает:

PHP:
while(1) { 
    eval('break 2;'); 
}
 

neko

tеam neko
емае
а так будет по твоему?
PHP:
	while(1)
	{ 
		{
   		break 2; 
		} 
	}
начинайте пробовать уже

-~{}~ 22.07.04 19:14:

и вообще тут вам не перл
 

neko

tеam neko
Re: include vs eval

Originally posted by young
И если таки нет то почему include все используют а eval все ругают?
а то, ты не знаешь как ее используют некоторые гении
и потому что инклюдить так файл никто не будет

не стыдно такое писать?
 

Demiurg

Guest
Может стоит посмотреть исходники, коль вопрос вас так интересует ?
 

Screjet

Новичок
Заглядывал как-то давно..

Разница между eval и include/require в том, что в первом случае компилируется строка, а во втором = файл, имя файла сохраняется в хеше (для include|require[_once]). Опкод один и тот же :)

-~{}~ 23.07.04 01:27:

Originally posted by young

И если таки нет то почему include все используют а eval все ругают?
Ругают при неумелом использовании..
А по сути назначение у этих конструкций = разное.

Например как я юзаю eval (спасибо Crazy)
PHP:
// в области класса инициализируем подключаемый модуль
$succes = eval('return  '.$mod_name.'::init();');
а по другому = никак. (в случае call_user_func вызов init() не видит $this)
 

young

Новичок
Разница между eval и include/require в том, что в первом случае компилируется строка, а во втором = файл, имя файла сохраняется в хеше (для include|require[_once]). Опкод один и тот же
Это меня и интересовало.
 

SiMM

Новичок
Автор оригинала: Oleg Marchuk
[strike]Вечный цикл[/strike] Фатал:
PHP:
while(1)eval('break;');
1.php
PHP:
<?while(1)include '2.php';?>
2.php
PHP:
<?break;?>
ведёт себя аналогично, если говорить об eval vs include.
 

lovchy

nacido para cifrar
> а по другому = никак. (в случае call_user_func вызов init() не видит $this)

А с какого бодуна ему видеть $this, если идёт обращение к методу класса, не к объекту. Eval ничего не меняет и call_user_func отработает именно так, как надо.
 
Сверху