Программирование > 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).
Навигация
Перейти к полной версии