Как использовать call_user_func_array с объектом с методом __construct в PHP - PullRequest
0 голосов
/ 20 декабря 2009

Как я могу использовать call_func_array для создания нового объекта с методом __construct (с некоторыми необязательными аргументами).

Вот код:

$urls = array(
    'view' => array(
        'view/(\d+)',
        array('controller' => 'test', 'action' => 'view'),
        array(1 => 'id'),
    ),
);

foreach ($urls as $name => $args) {
  $route = call_user_func_array(Zend_Controller_Router_Route_Regex, $args);
  $router->addRoute($name, $route);
}

Ответы [ 3 ]

7 голосов
/ 20 декабря 2009
$ref = new ReflectionClass('Zend_Whatever');

foreach ($urls as $name => $args) {
    $route = $ref->newInstanceArgs($args);
    $router->addRoute($name, $route);
}
4 голосов
/ 20 декабря 2009

Подпись для конструктора

($route, [ $defaults = array()], [ $map = array()], [ $reverse = null])

Таким образом, я хотел бы получить массив с пустыми аргументами и объединить его с фактическими аргументами для каждого маршрутизатора в вашем цикле. Если вы хотите упростить указание только последнего параметра, используйте строковые ключи в массиве конфигурации и в массиве по умолчанию.

$blank_opts = array('', array(), array(), null); //default options and blank route

foreach ($urls as $name => $args) {
  //replaces default options with options from the array, if set
  $opts = array_replace($blank_opts, $args);
  //create the new router
  $route = new Zend_Controller_Router_Route_Regex($opts[0], $opts[1], $opts[2], $opts[3]);
  $router->addRoute($name, $route);
}
1 голос
/ 20 декабря 2009

Например, у вас, похоже, есть синтаксическая ошибка (так как Zend_Controller_Router_Route_Regex должна быть строкой.

Таким образом, можно подумать, что это сработает:

$route = call_user_func_array(array('Zend_Controller_Router_Route_Regex', '__construct'), $args);

Однако, насколько я знаю, первый элемент массива (первый параметр) может быть либо строкой при вызове метода статического класса, либо экземпляром вашего класса для любого метода. Здесь тоже нет дела. Таким образом, я бы просто сделал это так:

$route = new Zend_Controller_Router_Route_Regex;
call_user_func_array(array('Zend_Controller_Router_Route_Regex', 'setOptions'), $args);

Возможно, вам придется использовать array($args) вместо $args в зависимости от типа этой переменной.

РЕДАКТИРОВАТЬ Нет, я не прав. Для маршрутов нет функции setOptions(). Позвольте мне кое-что проверить ...

EDIT2 Довольно уродливый хак, который я нашел в руководстве PHP относительно call_user_func_array(), следующий:

$route = new Zend_Controller_Router_Route_Regex;
call_user_func_array(array($route, '__construct'), $args);

Однако я не проверял это, и оно может не работать (если оно вообще может работать) в зависимости от реализации конструктора (принимает ли он параметры, не передаваемые ему? Просто устанавливает класс или выполняет другие дела тоже сделаны?). Скажите пожалуйста, сработало ли это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...