Программирование > PHP
Внедрение PHP кода в класс из MySQL
			Egorsha:
			
			А можно ли уточнить саму задачу. (По тексту обсуждается реализация одного из ее решений).
Если я правильно понял, то имеются несколько классов (объектов): class_1, class_2, ...., class_N. В этих классах, соответственно,  определены функции (методы) func_1, func_2, ..., func_N. И есть основной класс -  main_class, в котором необходимо выполнить один или несколько методов из набора func_1, ..., func_N. Причем заранее не известно сколько методов и какие именно методы понадобятся в ходе работы объета class_main.
Если задача именно такая, то могу предложить другое решение без использования MySQL. 
В основном классе будет вызываться что-то типа:
$[результат]=$[основной_класс]->[подгружаемый_класс]->[метод_подгруженного_класса]([набор_аргументов]);
(Если задача именно такая, как я описал выше, то подробное решение приведу здесь. Если нет, то и незачем топик засорять).
		
			CGVictor:
			
			[off]Egorsha 
А приводи, интересно. Вдруг.[/off]
		
			andymc:
			
			[OFF]а я вот вообще не понял о чём это вы тут,
но точно знаю что мне такое никогда не понадобится....[/OFF]
		
			Altaxar:
			
			Egorsha спасибо за внимание.
Вначале запущен только main_class  не какие классы не подзагружались.
и есть номер первого(первых) дополнительного класса и его метода.
в полученном методе определится еще пару номеров следующих классов и методов. и так далие.
каждый класс + метод в отдельном файле, но метод не как не связан со своим классом, для удобности он описывается в том-же файле. 
Но загвоздка, что мне надо провести рекурсию, не обращаясь к этим файлам(на данный момент движку не известен путь к файлу). 
Надеюсь я понятно уточнил задачу.
Если у тебя есть, чтото подобное, то выкладывай.
andymc 
Я думаю, что и не только тебе ;)
		
			Egorsha:
			
			Одно время приходилось "ковыряться" во внутренностях  системы eGroupWare (http://www.egroupware.org/). 
Кое-что взял оттуда на вооружение, но многое видоизменилось в процессе использования, поэтому пример приведу из первоисточника. Если кто заинтерессуется может скачать архив дистрибутива (около 38Мб), в котором около 40 000 файлов (очень долго распаковывается и копируется :)) и посмотреть  что там и как.
В коде классов этой системы создают и подключают на лету сколько угодно различных классов. Получаются что-то типа "класс наследник нескольких классов" (Вот это может и приходиться в интерессующей задаче).
Код имеет вид:
......
$this->so = CreateObject(\'addressbook.soaddressbook\');
....
$ret = $this->so->contacts->check_perms(False,$rights,$addr);
....
В первой строчке создается и подключается "на лету" класс 
../addressbook/inc/class.soaddressbook.inc.php. 
Во второй строчке, в подключаемом классе в свою очеред подключили еще один класс, но используют все их методы в основном классе.
Код функции создания и подключения класса "на лету":
	function &CreateObject($class)
	{
		list($appname,$classname) = explode(\'.\',$class);
		include_once($file=EGW_INCLUDE_ROOT.\'/\'.$appname.\'/inc/class.\'.$classname.\'.inc.php\');
		if (class_exists($classname))
		{
			$args = func_get_args();
			if(count($args) == 1)
			{
				$obj =& new $classname;
			}
			else
			{
				$code = \'$obj =& new \' . $classname . \'(\';
				foreach($args as $n => $arg)
				{
					if ($n)
					{
						$code .= ($n > 1 ? \',\' : \'\') . \'$args[\' . $n . \']\';
					}
				}
				$code .= \');\';
				eval($code);
			}
		}
		if (!is_object($obj))
		{
			echo "<p>CreateObject(\'$class\'): Cant instanciate class!!!
\\n".function_backtrace(1)."</p>\\n";
		}
		return $obj;
	}
Для передачи данных между различными классами используется массив $GLOBALS. (Этот массив может быть лучше и использовать вместо MySQL).
		
Навигация
Перейти к полной версии