Запуск объектов в разных окружениях

qwe011

Новичок
Запуск объектов в разных окружениях

Здравствуйте.
Суть задачи состоит в следующем: необходимо сделать некое подобие nix окружения для запуска в них разных объектов .

Т.е. все примерно так должно выглядеть:
PHP:
Env1 {
    $x = 10; # значение переменной доступно для чтения/записи только в Env1

    $a = new A();
    $b = new B();

    $y = $a->func($x) + $b->func($x);
}

Env2 {
    $x = 20;

    $a = new A();
    $d = new D();

    $y = $a->func($x) + $d->func($x); # здесь $x = 20
}
Плюс ко всему нужен механизм доступа к переменным и классам, объявленным в разных Env - что-то вроде EnvManager
PHP:
$x = EnvManager::get('Env1')->get('x');
foreach ( EnvManager::getEnvs() as $env ) {
    $y += $env->get('y');
}
Подскажите пожалуйста в какую сторону копать, с какой стороны подступиться к реализации. Возможно есть готовые решения?
 

qwe011

Новичок
А не могли бы вы написать небольшой пример решения задачи с использованием этого паттерна?

-~{}~ 15.06.08 22:04:

У меня вот такой вариант:
PHP:
<?php
class A {
	function func($x) { return $x*2; }
}
class B {
	function func($x) { return $x*4; }
}

class EnvManager {
	
	protected $envs;
	
	function & execInEnv( $code ) {
		$buf =& new Env();
		$buf->execCode($code);
		
		$this->envs[] = $buf;
		return $this->envs[sizeof($this->envs)-1];
	}	
	
	function & nextEnv() {
		$buf = each($this->envs);
		return $buf['value'];
	}
}

class Env {
	protected $data;
	
	function __set($name, $value) { $this->data[$name] = $value; }
	function __get($name) { return isset($this->data[$name]) ? $this->data[$name] : null; }
	
	function execCode( $code ) {
		eval($code);
	}
	
	function getData() {
		return $this->data;
	}
}

// code1
$code = '$x = 10; $a = new A(); $this->y = $a->func($x);';

$envm = new EnvManager();
$res = $envm->execInEnv($code);
print_r($res->getData()); // Array ( [y] => 20 )

// code2
$code = '$x = 10; $b = new B(); $this->y = $b->func($x);';
$envm->execInEnv($code);

while ( $env =& $envm->nextEnv() ) {
	print_r($env->getData());
} // Array ( [y] => 20 ) Array ( [y] => 40 )

?>
 

iamFake

Mind Of Liberty
полагаю ваш код(в первом посте, пример с Env1 {} ) с небольшими "доделками" вполне валиден в пхп 5.3.0 или например 5.2.6 с патчем namespaces
 

qwe011

Новичок
К сожалению патч применить никак не удастся.

-~{}~ 16.06.08 15:44:

У кого-нибудь есть ещё варианты решения? Без использования NS
 

crocodile2u

http://vbolshov.org.ru
qwe011
ну, эта... а если так:

PHP:
class Env {
  private $var1,...;
}
Т.е. class Env - инкапсуляция этого самого "окружения". Каждое окружение же - экземпляр Env.

Вот только эти штучки ты брось:
$code = '$x = 10; $a = new A(); $this->y = $a->func($x);';

До добра такое не доведет.

И, кстати, несмотря на то, что, видимо, в каком-то виде решение твоей задачи существует - я не могу не задать вопрос: зачем оно тебе надо? Зачем ты хочешь есть суп вилкой? Есть большое подозрение, что, посвяти ты нас в свои мотивы - тебе бы подсказали лучшее решение...
 

qwe011

Новичок
Весь сыр-бор из за следующего:

Вот схема работы скрипта:
1) есть объект Request, он содержит url, например /news
2) объект передаётся на выполнение в Core, core в соответсвием с переданным url выполняет ряд действий, но среди этих действий может быть формирование нового Request и отправка его на выполнение (т.е. повторяется шаг 2).

Когда Core обработал все запросы он отдал результат. Результат представляет собой список "ответов" на каждый Request.

Пример:
PHP:
$r = new Request('/news');
$r->send();

...
// действия в Core для запроса /news

$res = 'новости';
$r = new Request('/news/top10');
$r->send();

$x = Core::getResponse('/news')->res; // $x будет содержать 'top 10 новостей'

// далее выполняются действия для /news/top10
// $res = 'top 10 новостей';
...

/* в результате на выходе должно получится:
Response Object
(
    [name] => /news
    [res] => новости
)
Response Object
(
    [name] => /news/top10
    [res] => top 10 новостей
)
*/
 

crocodile2u

http://vbolshov.org.ru
Из того, что ты рассказал, совершенно неочевидно, зачем тебе эти окружения...
 
Сверху