如何在PHP中使用带有__construct方法的对象调用call_user_func_array

时间:2009-12-20 12:56:59

标签: php zend-framework

我如何使用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 个答案:

答案 0 :(得分:7)

$ref = new ReflectionClass('Zend_Whatever');

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

答案 1 :(得分:4)

构造函数的签名是

($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);
}

答案 2 :(得分:1)

首先,您似乎有语法错误(因为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 manual regarding call_user_func_array()找到的一个相当丑陋的黑客攻击如下:

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

但是,我没有测试它,它可能不起作用(如果它可以工作)取决于构造函数的实现(它是否接受没有传递给它的参数?它只是设置类或其他事情也完成了吗?)。请告诉我它是否有效......