Автор Тема: Внедрение PHP кода в класс из MySQL  (Прочитано 7004 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
Внедрение PHP кода в класс из MySQL
« : 08 Октября 2007, 12:34:01 »
Появившуюся задачу можно разделить на 2 части.
1) У меня есть класс(обьект) в нем функция, мне нужно както получить код из этой функции, и записать в MySQL в виде строки (как работать с MySQL я знаю :) )
2) Получаю строку из MySQL и необходимо добавить в обьект данную функцию.

Все очень глупо выглядит. но действия выглядит так:
1 пункт выполняется в последствии какогото события.
а 2 пункт при новом старте скрипта, и у меня нету возможности прикрепить данную функцию через include .

в 1 пункте склоняюсь к парсеровки класса, регулярами.
У кого какие идеи есть на счет этого?
Не все является тем чем кажется.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Внедрение PHP кода в класс из MySQL
« Ответ #1 : 08 Октября 2007, 12:59:15 »
Altaxar
Гм...уже с ходу - не думаю, что есть какое-то красивое и правильное решение.

Пока что на ум приходит - да, парсить код при помещении его в mysql, а наоборот - создание наследника класса на лету и include его к коду. Но это только в теории. На практике - грабли...
LJ: Backslashed life (rss)

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
Внедрение PHP кода в класс из MySQL
« Ответ #2 : 08 Октября 2007, 22:18:58 »
1. Если укажете зачем в целом это надо, может быть мы вам дадим другое решение этого вопроса.
2. Для парсинга кода, если вы на php5, попробуйте использовать Reflection (Глава 19. Классы и объекты (PHP 5))

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Внедрение PHP кода в класс из MySQL
« Ответ #3 : 08 Октября 2007, 23:45:35 »
andymc
Кстати, да. Reflection.

http://ru2.php.net/manual/ru/language.oop5.reflection.php

Но рефлектор, имхо, еще такая сырость...
LJ: Backslashed life (rss)

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
Внедрение PHP кода в класс из MySQL
« Ответ #4 : 09 Октября 2007, 16:37:49 »
andymc
Наверно я слишком строго написал то, что мне надо в пункте 2.
поэкспериментировал и решение найдено.

Для чего мне это надо? все просто, пишу свою систему(движок) уже можно сказать готов(осталось пару корректировок и база стандартных скриптов но это дела времени).

Идея в том, что определение подгружаемых классов определяется в несколько этапов, но все определяется до создание этих классов, так как у меня классы обрабатываются не последовательно а параллельно.
И для гибкости нужны аспекты определяющие классы которые еще нужны в данный момент. Вот и получается что класс еще не определен а аспект надо запустить, вот я и решил их в MySQL хранить.

У меня сейчас сделано просто, есть переменная в классе в которой строкой присвоен данный аспект, и он записывается в MySQL если его там еще нету, так что на скорость данного действия мне всеравно.
Затем при старте они запускаются при помощи создание функции на лету.

Но не удобно писать аспект строкой, поэтому хочу сделать парсинг данного класса.
Во вторых для удобства написание данного аспекта желательно готовые функции, тоесть как класс для аспекта.

Решение такое: создаем функцию на лету и передаем сылку на данный обьект. пробывал как переменную $this (ошибка), но заменив на $my_this все заработало, и в парсинге заменить $this на $my_this. и теперь все ок.
Если у кого есть более интересное решение, буду благодарен.
Reflection. спасибо за подсказку, почитаю.
Не все является тем чем кажется.

Оффлайн Egorsha

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Внедрение PHP кода в класс из MySQL
« Ответ #5 : 15 Октября 2007, 15:32:36 »
А можно ли уточнить саму задачу. (По тексту обсуждается реализация одного из ее решений).

Если я правильно понял, то имеются несколько классов (объектов): class_1, class_2, ...., class_N. В этих классах, соответственно,  определены функции (методы) func_1, func_2, ..., func_N. И есть основной класс -  main_class, в котором необходимо выполнить один или несколько методов из набора func_1, ..., func_N. Причем заранее не известно сколько методов и какие именно методы понадобятся в ходе работы объета class_main.

Если задача именно такая, то могу предложить другое решение без использования MySQL.

В основном классе будет вызываться что-то типа:

$[результат]=$[основной_класс]->[подгружаемый_класс]->[метод_подгруженного_класса]([набор_аргументов]);

(Если задача именно такая, как я описал выше, то подробное решение приведу здесь. Если нет, то и незачем топик засорять).

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Внедрение PHP кода в класс из MySQL
« Ответ #6 : 15 Октября 2007, 18:28:59 »
[off]Egorsha
А приводи, интересно. Вдруг.[/off]
LJ: Backslashed life (rss)

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
Внедрение PHP кода в класс из MySQL
« Ответ #7 : 15 Октября 2007, 22:48:31 »
[OFF]а я вот вообще не понял о чём это вы тут,
но точно знаю что мне такое никогда не понадобится....[/OFF]

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
Внедрение PHP кода в класс из MySQL
« Ответ #8 : 16 Октября 2007, 00:28:03 »
Egorsha спасибо за внимание.
Вначале запущен только main_class  не какие классы не подзагружались.
и есть номер первого(первых) дополнительного класса и его метода.
в полученном методе определится еще пару номеров следующих классов и методов. и так далие.
каждый класс + метод в отдельном файле, но метод не как не связан со своим классом, для удобности он описывается в том-же файле.
Но загвоздка, что мне надо провести рекурсию, не обращаясь к этим файлам(на данный момент движку не известен путь к файлу).
Надеюсь я понятно уточнил задачу.
Если у тебя есть, чтото подобное, то выкладывай.
andymc
Я думаю, что и не только тебе ;)
Не все является тем чем кажется.

Оффлайн Egorsha

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 60
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Внедрение PHP кода в класс из MySQL
« Ответ #9 : 16 Октября 2007, 10:58:49 »
Одно время приходилось "ковыряться" во внутренностях  системы 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).
« Последнее редактирование: 16 Октября 2007, 13:59:22 от Egorsha »

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
Внедрение PHP кода в класс из MySQL
« Ответ #10 : 25 Октября 2007, 13:59:21 »
Egorsha
Спасибо за подсказку, у меня очень много классов, и размещать в одной папке не получится. у меня все пути к файлу класса находятся в MySQL(есть множество плюсов), причем рекурсивно. так, что получать путь для каждого класса по отдельности нехорошо. так что я собираю все id классов и за пару запросов получаю все url. и не только к классам.
Вот, что у меня получилось:

$return_mysql
=\'$this->sss();\';//храню код функции в MySQL, другого выхода нету.
class bbb  {
	
function sss(){
	
	
echo \'alex\';
	
}
}
$str=\'class aaa extends bbb { function aaa(){\'.$return_mysql.\'}}\';
eval($str); //спасибо за данную функцию, я так и не мог понять до этого, что она делает
new aaa;
Не все является тем чем кажется.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28