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