include vs eval

Screjet

Новичок
Для шибко умных:
PHP:
<?php                                             
class mod {                                       
                                                  
    var $var = 'mod';                             
                                                  
    function init(){                              
        print_r($this);                           
    }                                             
}                                                 
                                                  
class my {                                        
                                                  
    var $var = 'my';                              
                                                  
    function my(){                                
        eval('mod::init();');                     
        call_user_func( array('mod','init') );    
    }                                             
}                                                 
                                                  
$t = new my();                                    
?>
 

vadimiron

Guest
eval-выполняет строку как код, это может быть полезно например, чтобы хранить куски кода в базе данных
include-подключает файл для выполнения
 

lucas

Guest
vadimiron

Ты думаешь, что твоего поста все ждали, затаив дыхание?
Что [m]нового[/m] ты сообщил?
 

vadimiron

Guest
lucas
А зачем так агрессивно??
Тема называется include vs eval, я и показал в чём главная разница для меня, то есть include vs eval это строка vs файл, со всеми вытекающими отсюда последствиями
А в чём проблема??
 

lucas

Guest
Проблема в том, что топик нужно читать перед тем, как писать в него.
Это на будущее.
 

Rin

*
Автор оригинала: Oleg Marchuk
http://us2.php.net/manual/en/function.eval.php

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

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

Screjet

Новичок
Вобщем допустил такую грубую ошибку и никто не исправил..

Обшибка/разница в том, что в подключаемом файле код должен быть в ПХП-тегах, а в eval = исключительно ПХП-код.

Сорри за такую грубую дезинформацию :(
 

vitus

мимо проходил
;)
всё проще

include(file_name) применяется для сборки результирующего кода причём делает так:
PHP:
?>file_content<?
и прописывает этот файл в списке воткнутых файлов

eval(string) действительно только делает eval собраной строчки

насчёт того что эвал плох - да его плохо использовать вместо include() - не удобно :)
а вот хранить код в базе данных - вообще строго не рекомендую, во первых - не нужно, во вторых стрёмно - юзеры бывают разные.

Screjet
расскажи поподробнее про
$succes = eval('return '.$mod_name.'::init();');
- не могу себе представить необходимость такой конструкции, почемуто ...

насколько себя помню эвал пользовал только в жаваскрипте, по лености (не охота было классы для кнополок делать)
 

Screjet

Новичок
Повторю открытым текстом: eval() используется для реализации конструкций несуществующих в языке.

>не могу себе представить необходимость такой конструкции, почемуто ...
Запусти пример выше и все станет ясно. А если не станет ясно, значит рано еще об этом задумываться.
 

vitus

мимо проходил
Originally posted by Screjet
Повторю открытым текстом:
:) спасибо
>не могу себе представить необходимость такой конструкции, почемуто ...
Запусти пример выше и все станет ясно. А если не станет ясно, значит рано еще об этом задумываться. [/B]
да мне и так в общем-то ясно, непонятно только зачем инициировать класс my методом класса mod и притом обязательно статическим вызовом,
собственно задача, которую ты этим решаешь остаётся для меня загадкой, ну правда, расскажи - зачем?
вот так можно например, хотя в твоём вариане короче :)
PHP:
<?php                                              
class mod {                                        
                                                   
    var $var = 'mod';                              
                                                   
    function init(&$obj){                               
        $obj->var1 = $obj->var.$obj->var1;
//да ещё тут можно использовать и $this->var, если вдруг надо
    }

}                                                  
                                                   
class my {
                                                   
    var $var = 'my';                               
    var $var1 ='my1';
    
    function my($mn){                                 
        $mod=new $mn(); 
        $mod->init($this);
    }
    
}                                                  

$t=new my("mod");
print_r($t);
?>
-~{}~ 03.09.04 14:10:

кстати насчёт рано :) - так для справки, ты ешё во второй класс начальной школы ходил, когда я первый большой проект затеял :)
 

Screjet

Новичок
[Сорри за оффтоп: к теме не относится]

>вот так можно например, хотя в твоём вариане короче
Именно.

>так для справки, ты ешё во второй класс начальной школы ходил, когда я первый большой проект затеял
Не спорю. С ПХП работаю только полтора года (см. дату регистрации на форуме) :)

Такой модуль является гибким расширением основного объекта. У модуля свои методы, которые в основном влияют на основной объект, точнее формируют его. Теоретически, можно было бы задачу решить наследованием, но заранее неизвестен какой будет базовый класс.

Твой код по принципу такой же, прсто разный подход: у тебя в основе лежит агрегация, у меня = наследование. Результат = один и тот же.

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

che

Guest
Не совсем по теме но здесь был затронут вопрос производительности, может кому интересно будет.
PHP:
<?php

clearstatcache();

$Gsv_statist['start']=microtime();

include_once is_file ('./includes/options.php')   ? './includes/options.php'   : exit('file not found');

$Gsv_statist['middle']=microtime();

//$h=fopen('./cache/test.swp', 'w+');

//fwrite($h, serialize($GLOBALS));

//fclose($h);

$Gsv=unserialize(file_get_contents(is_file ('./cache/test.swp') ? './cache/test.swp' : exit('file not found')));
foreach  ($Gsv as $key => $value) $GLOBALS['Gsv_'.$key]=$value;
unset ($Gsv);

$Gsv_statist['end']=microtime();


list($usec_start, $sec_start) = explode(" ",$Gsv_statist['start']); 

list($usec_end, $sec_end) = explode(" ",$Gsv_statist['middle']);


echo ((float)$usec_end + (float)$sec_end)-( (float)$sec_start+(float)$usec_start), '<hr>';


list($usec_start, $sec_start) = explode(" ",$Gsv_statist['middle']); 

list($usec_end, $sec_end) = explode(" ",$Gsv_statist['end']);

echo ((float)$usec_end + (float)$sec_end)-( (float)$sec_start+(float)$usec_start);

?>
инклуд скрипта в котором только обьявления переменных работает в среднем в два раза медленнее чем unserialize предварительно serialize массива GLOBALS.
Попробовал на lang_admin.php от phpBB, разница до трех раз. По ходу, чем больше переменных, тем больше разница.
 

Фанат

oncle terrible
Команда форума
che
а можно спросить - зачем тебе эти тесты?
тебя не устраивает производительность того или иного метода?
 

che

Guest
Originally posted by Фанат
che
а можно спросить - зачем тебе эти тесты?
Я прикручивал к своим скриптам кеширование результатов SQL-запросов, по пути стало интересно даст ли выигрыш подключение всяких переменных и массивов таким же образом. Проверил - выигрыш есть. Сейчас все данные которые не зависят от параметров запроса загружаются таким вот макаром
PHP:
if (is_file('./cache/index.swp')) {
	extract(unserialize(file_get_contents('./cache/test.swp')));
	eval ($Gsv_functions);
	unset $Gsv_functions;
}
else {
	...

         ...
}
Потом проверка входных параметров и поиск кеша, в котором данные, зависящие от этих параметров. Если такового нет, обычная отработка.
Кстати о применении eval(). не настаиваю, но вот прямо сейчас это дело реализовываю, может выскажитесь по поводу. Все функции лежат в одном файле, разделенные разделителями. :D Файл парсится регексом, получаем массив в котором каждый элемент - текст функции. Затем убиваем те, что данному скрипту не нужны , конкатим и сохраняем в том же кэше. При подкачке eval этой переменной и определены те функции что нужны для работы без затрат на парс функций не нужных. В итоге и функции все в одном месте и лишнего времени не тратится. Imho, думать о производительности не самое плохое занятие.
 

Фанат

oncle terrible
Команда форума
Imho, думать о производительности не самое плохое занятие.
имхо твое неправильное.
Думать надо о доме, о жене, о детях. Об успеваемости и поведении, на худой конец. О женщинах.
А о производительности думать не надо. Это вредно.
может выскажитесь по поводу.
выскажемся.
Обработку ошибок твой евал делает в обрабатываемом коде?

-~{}~ 15.09.04 21:39:

Да, и реальный прирост производительности тоже интересно узнеть.
Не эти ламерские циферки, а реально, в процентах от общеих затрат на обработку запроса.
 

che

Guest
Originally posted by Фанат
... на худой конец. О женщинах.
Согласен. С худым концом о женщинах только думать и остается. :D А у меня вот одна есть, меня она устраивает.

выскажемся.
Обработку ошибок твой евал делает в обрабатываемом коде?
А расскажи мне поподробнее про обработку ошибок при объявлении функций.


Да, и реальный прирост производительности тоже интересно узнеть.
Не эти ламерские циферки, а реально, в процентах от общеих затрат на обработку запроса.
На SQL запросах в среднем в два раза. Ты мальчик взрослый, в проценты сам переведешь. Надеюсь сам сможешь понять что зависит от запросов.
Да, и еще. Я знаю, в это трудно поверить, но представь себе, есть люди, разбирающиеся в предмете если не лучше, то не хуже тебя. Это с трудом возможно уместится у тебя в голове, но ты птица большая, сильная, я знаю, ты справишься. Честно говоря мне было интересно те только и не столько твое мнение, но все равно спасибо что обратил внимание.

-~{}~ 15.09.04 22:07:

Originally posted by Oleg Marchuk
che
А что, кешируешие сервера отменили?
Zend, memcache,...
Стоит не везде, да и как они будут кэшировать результаты SQl запросов, данные? Про кеширование на стороне SQL сервера не надо, в курсе. Но зачем лишнее обращение если всю работу скрипта можно свести к 2-3 чтениям файлов? Даже если в нем куча инклудов и запросов к базам?
 

Фанат

oncle terrible
Команда форума
На SQL запросах в среднем в два раза
о!
так ты научился евалом SQL запросы исполнять???
Снимаю шляпу и безоговорочно признаю твою крутость.

Ты мальчик взрослый, в проценты сам переведешь.
К сожалению, я достоточно взрослый для того, чтобы понимать, что если операция отнимает 1 процент от общего времени задачи, то ускорение ее в 2 раза ускорит само приложение на 1 процент.

Вот общие цифры я и хотел от тебя услышать.
 

che

Guest
Originally posted by Фанат
о!
так ты научился евалом SQL запросы исполнять???
Снимаю шляпу и безоговорочно признаю твою крутость.
Не тормози, эвалом я объявляю функции, те самые, про обработку ошибок которых ты мне хотел рассказать :D Прочти топик с начала, там про это есть, я знаю. Не все могут усваивать инфу с первого раза, ничего зазорного в этом нет.

К сожалению, я достоточно взрослый для того, чтобы понимать, что если операция отнимает 1 процент от общего времени задачи, то ускорение ее в 2 раза ускорит само приложение на 1 процент.

Вот общие цифры я и хотел от тебя услышать.
Наконец то речь не мальчика но мужа. Только считаешь ты не правильно. Хотя в верном направлении. Пошел считать в процентах всё и вся.
 
Сверху