Фабричный метод создания объектов @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 4 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Заголовок сообщения: Фабричный метод создания объектов
Сообщение Добавлено: 20 Октябрь 2005, 16:51:47 
В PHP у меня возникла потребность в написании фабричного метода создания объектов, которые сами могут ожидать произвольное число аргументов в своём конструкторе. То есть фабричный метод сам получает произвольное кол-во аргументов и передает эти аргументы в соответствующий конструктор по ссылке, в том виде как их сам получил. По идее, здесь бы подошло что-нибудь вроде call_user_func_array(), но вот засада! new - не функция, а языковая конструкция... :-(

P.S. Вариант передавать все необходимые параметры одним массивом и сведя таким образом задачу к передаче фиксированного числа аргументов в конструктор не подходит -- я ищу элегантное решение.

P.P.S. Использую PHP5, но это вроде пофиг.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 20 Октябрь 2005, 17:18:30 
попробуй тогда зайти с другой стороны http://ru3.php.net/func_get_args

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Paul Yanchenko Муж.
новый человек
1
Сообщения: 112
Зарегистрирован: 05.02.04
Откуда: Екатеринбург
Сообщение Добавлено: 20 Октябрь 2005, 18:19:26 
Ну, про эти функции я знаю, получить аргументы в фабричном методе я могу... Я не знаю как их все передать в конструктор.

Не писать же мне:

Код:
public static function &factory()
{
  $class = 'MyClass';
  switch (func_num_args())
  {
    case 0 : $object = new $class(); break;
    case 1 : $object = new $class(func_get_arg(0)); break;
    case 2 : $object = new $class(func_get_arg(0), func_get_arg(1)); break;
    case 3 : $object = new $class(func_get_arg(0), func_get_arg(1), func_get_arg(2)); break;
    ………
  }
  return $object;
}


Тут похоже только eval() подойдёт, но это тоже не элегантно, т.к. всякие пхп-акселераторы eval-код не кэшируют.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 21 Октябрь 2005, 11:02:13 
Лично я в этой ситуации просто разделил new, создаюший объект, и init(args), выполняющий настройку.

_________________
We've got the big memory and the small memory. The small memory's to remember the small things and the big memory's to forget the big ones.
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 4 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100