LINUX.ORG.RU

[php] как работает eval?

 


0

1

Хотелось бы узнать сам процесс работы eval, не зачем он нужен (в интернете 100500 описания), а как он это делает. Есть предположение, что во время выполнени eval() создается копия php интерпритатора который выполняет сам код. Но это только предположение, т.к. описания работы я так и не нашел. То ли это никому не интересно, то ли слишком низкий дан пользования поисковыми запросами.

Одна надежда на тебя LOR.


второй экземпляр php вроде не вызывается.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

при том, что я её со всякими system() и passthru(), там их много разных, думал eval() из той-же серии. Ошибся... Бывает...

drBatty ★★
()

а как он это делает

а что такого особенного делает eval(), например в отличии от include() ?

...по сути это почти одно и тоже :-)

и include() тоже точно также НЕ вызывает fork() во время своей работы

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Обычно через eval в php создают классы плагинов в супер крутых движках. Хотя там и помимо eval куча косяков.

xpahos ★★★★★
()

Нашел чудо метод в сорцах php zend_do_include_or_eval и его объявление

 void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) /* {{{ */
 {
         zend_do_extended_fcall_begin(TSRMLS_C);
         {
                 zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
 
                 opline->opcode = ZEND_INCLUDE_OR_EVAL;
                 opline->result.op_type = IS_VAR;
                 opline->result.u.var = get_temporary_variable(CG(active_op_array));
                 opline->op1 = *op1;
                 SET_UNUSED(opline->op2);
                 Z_LVAL(opline->op2.u.constant) = type;
                 *result = opline->result;
         }
         zend_do_extended_fcall_end(TSRMLS_C);
 }

Вот только не понимаю из-за скудных знаний СИ как он работает. Получается, что eval и include работают с одинаковой производительностью и единственный минус eval в жуткой поддержке такого кода?

anthill
() автор топика

А исходники глянуть?

r2d2
()
Ответ на: комментарий от anthill

Похоже eval есть почти что тоже самое что include.
В принципе разумно, какая разница откуда инклудить код, из файла или из строки.

urxvt ★★★★★
()
Ответ на: комментарий от anonymous
<?php
class Test {
    public function __construct(){
        echo "123 \n";
    }

    public function a(){
        echo 321;
    }
}
eval('$a = new Test();');
$a->a();

output:

123
321

anthill
() автор топика
Ответ на: комментарий от GateKeeper

try-catch не проходили на алгебре?

Да там и без try-catch ничего не умирает:

$ php -r 'echo "one"; @eval("blah-blah"); echo "two";'
onetwo

Если не экранировать, выплюнет ошибку парсинга, но ошибку только для eval, не для скрипта в целом.

KRoN73 ★★★★★
()
Ответ на: комментарий от GateKeeper

try-catch не проходили на алгебре?

Жирновато как-то. Думаю, даже eval smth; echo 'BOOM' if $@; будет легче.

И да, если Вы на алгебре проходили try-catch, у меня для Вас плохие новости...

helios ★★★★★
()
Ответ на: комментарий от anthill

Интерпретатор пхп по-твоему не умеет интерпретировать? Что вообще не ясно?

Ну если интересно как работает парсер и лексер, выстраивается AST, то можешь почитать Ахо.

tensai_cirno ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.