[PHP5.0.4] Eval в определённом контексте

wildfire

Guest
[PHP5.0.4] Eval в определённом контексте

Есть ли способ выполнить код через что-то типа eval, только с возможностью опредлить контекст выполняемого кода? Например , как в pythonовском "execute". Поиски в мануале дали ответ RunKit SandBox. Но он вроде как есть только в 5.1-dev.. Есть ли более другие способы?
 

tony2001

TeaM PHPClub
приведи пример.

P.S. "можно ли сделать xxx как в Brainfuck?" - тебе этот вопрос о много говорит?
Вот и мне " как в pythonовском "execute"" ничего не говорит.
 

wildfire

Guest
Смысл в том, что в питоне можно задать "окружение" заранее неизвестного кода. Я могу определить переменные, которые "видит" код. Блин, запутанно как-то звучит..

вобщем хочется такого:
PHP:
$c = 1;
$d = 2;
$e = 3;
$code = "$a = $a + $b;
$e = 1; //e - локальна для этого кода";
какойнитьeval($code, array("a"=>$c, "b"=>$d));
echo $c.$e;
должно вывести:
33

то есть для кода в $code на момент запуска будут существовать только переменные $c и $d под именами a и b :)
 

StUV

Rotaredom
можно просто добавить к $code в начало инициализацию
или сделать шаблон и вставлять в нужные инициализации необходимые значения
(т.е. строковых функций будет вполне достаточно)
 

svetasmirnova

маленький монстрик
wildfire
А если [m]pcntl_fork[/m] его? Дочерний процесс от родительского наследует всё окружение.
 

Макс

Старожил PHPClub
А можно пример реальной задачи, где это нужно ?
ИМХО ты просто в ПХП используешь свои питоньи привычки.

ЗЫ
как вариант :
PHP:
function kakoi_to_eval($code, $values=array()) {
   $args = array();
   extract($values);
   eval($code);
   return $args;
}
$c = 1;
$d = 2;
$e = 3;
$code = '$a = $a + $b;
$e = 1; //e - локальна для этого кода
$args = array("c"=>$a);';
extract(kakoi_to_eval($code, array("a"=>$c, "b"=>$d)));
echo $c.$e;
 

wildfire

Guest
Автор оригинала: Макс
А можно пример реальной задачи, где это нужно ?
Просто стало интересно. Покопался - не нашел. Решил спросить. Имхо, вопрос интересный. Например один и тот же код можно выполнять в разных местах, заранее зная и устанавливая только необходимый контекст. И при этом никаких ограничений.

ИМХО ты просто в ПХП используешь свои питоньи привычки.
:D я не питон ;)

Вывод один - придётся ждать PHP 5.1 :) и sandbox.
 

SiMM

Новичок
> Вывод один - придётся ждать PHP 5.1 и sandbox.
А почему ты думаешь, что там это будет? Тем более, что примера реальной задачи, где это нужно и где без этого ну никак, ты привести не смог. А что-то делать только ради удовлетворения одного единственного пользователя врядли будут.
 

tony2001

TeaM PHPClub
циклы разработки пакетов из PECL не зависят от циклов релизов PHP - для этого PECL и нужен.
поэтому runkit можно поставить хоть сейчас.
 

wildfire

Guest
В документации написали, что работать он будет только с текущим 5.1.
2SiMM
я runkit не писал => нас уже как минимум два :D
 

tony2001

TeaM PHPClub
>В документации написали, что работать он будет только с текущим 5.1.
http://snaps.php.net ?

>я runkit не писал => нас уже как минимум два
да, два.
только Сара, как минимум, признает, что этот модуль не для нормальных людей:
For all those things you.... probably shouldn't have been doing anyway....
 
Сверху