Вы не зашли.
Голова уже лопается... необходимо при создании объекта класса, передавать неопределенное колличество аргументов!
Например:
Код:
span style="color: #0000BB"><?phpfunction getClass($name, $args=array()){ $a = new $name(/* Сюда надо как то вставить аргументы из массива $args */); return $a;} |
потом
Код:
span style="color: #0000BB"><?php$a = getClass('class_one', array(1, 2, 3, 4));$b = getClass('class_two', array('a', 'b', 'c')); |
Как это можно реализовать? __autoload даже не предлагать гг
Пробовал еще так:
Код:
span style="color: #0000BB"><?php$a = new $name();call_user_func_array(array($a, '__construct'), $args); |
Но тогда фигня выходит... Обьекты дублируются:
array(0) { }
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
array(0) { }
array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
это хорошо если аргументы не указаны в конструкторе! а если указаны...
Должно быть как минимум два, и я введу эти два аргумента, а мне будет выдавать ошибку, и скрипт будет спокойно работать дальше!
Я буду лучше голоден, но между креслом и рулем и на дороге.
Все! разобрался!
Мне интересно почему так получается, если в функции создать класс, то выдаст ошибку, если же в этой же функции подключить файл (через include / require) то все нормально?
Я буду лучше голоден, но между креслом и рулем и на дороге.
не понял.. как ты создаешь класс? через eval чтоли? и как проблему с неопределенным числом аргументов решил?
Nu3oNВозможно проблема из за не глобальных переменных
Отредактировано TLENS (2011.08.23 20:08)
Gemorroj написал:
не понял.. как ты создаешь класс? через eval чтоли? и как проблему с неопределенным числом аргументов решил?
Код:
span style="color: #0000BB"><?phpfunction getClass($name, $args=array()){ require($name . '.class.php'); require('PassingArguments.class.php'); result new PassingArguments($args);}И сам файл PassingArguments:eval(' class PassingArguments extends '.$name.' { function __construct($args) { call_user_func_array(\'parent::__construct\', $args); } }');?> |
Добавлено спустя 2 минуты 31 секунду: Можно еще так:
Код:
span style="color: #0000BB"><?php$reflection = new ReflectionClass('NameClass');$object = $reflection -> newInctanceArgs(array(/* аргументы */));?> |
Но не у всех есть такая библа
Я буду лучше голоден, но между креслом и рулем и на дороге.
Как решить проблему?
Когда файл отдается php скриптом (fread) встречается проблема пока отдается файл то не загружает остальные страницы пока полностью не отдастся файл.
Nu3oN, я тоже переодически сталкиваюсь с такой проблемой с аргументами, пока нормальных решений не знаю. что eval, что Reflection - говно..
Добавлено спустя 1 минуту 20 секунд: TLENS, подробнее код. по-моему, это уже обсуждали, возможно, загружен канал
Gemorroj написал:
Nu3oN, я тоже переодически сталкиваюсь с такой проблемой с аргументами, пока нормальных решений не знаю. что eval, что Reflection - говно..
Лучших вариантов на ближайшее время не вижу (= точнее вообще никаких не наблюдаю гг
Я буду лучше голоден, но между креслом и рулем и на дороге.
В общем очередной раз переписываю свою cms, и вот решил изменить полностью структуру MVC...
В прошлый раз я писал все иначе, все делилось просто: "/папка/контроллер/переменные" без права на выбор!
Теперь решил все сделать как должно быть! и мне необходимо из URL получить путь к контроллеру, класс контроллера и выводимый метод, с учетом того-что папок может быть очень много! решил это реализовать так:
Код:
span style="color: #0000BB"><?php $_GET['do'] = '/dir/dir/dir/class/method/'; // Образец (папок может быть хоть сколько) $arrDefault = array('path' => 'home', 'class' => 'welcome', 'method' => 'index', 'vars' => 'null'); $arrPath = array_filter(explode('/', $_GET['do']), 'trim'); $intPath = count($arrPath); $i=0; $get = array('str'=>'', 'dir'=>'', 'class'=>''); foreach ($arrPath as $key) { $get['str'] = (empty($get['dir']) ? null : $get['dir']) . $key; if (is_dir(PS_EXTRA_CONTROLLERS . $get['str']. '/')) { $get['dir'] = $get['str'] . '/'; } else { if (is_file(PS_EXTRA_CONTROLLERS . $get['str'] . '.php')) { $get['class'] = $arrPath[$i]; } } ++$i; } $arrDefault['path'] = empty($get['dir']) ? $arrDefault['path'] : $get['dir']; $arrDefault['class'] = empty($get['class']) ? $arrDefault['class'] : $get['class'];?> |
Насколько это гуманно?
Я буду лучше голоден, но между креслом и рулем и на дороге.
ну да, 2 вариант - маппинг. т.е. разработчик сам прописывает в диспетчере все возможные запросы, и в бутстрапе просто ищутся соответствия с заранее определенными правилами.