call_user_func_array解析对象时出错

时间:2013-06-14 08:57:01

标签: php oop

你好,我有以下代码,我有以下错误: 任何想法怎么做?

Argument 1 passed to Invoice\Invoice::__construct() must be an instance of Invoice\Data, none given, called in /Template.php on line 55 and defined

    if(!empty($this->class1) && !empty($this->class2))
    {
        if(!empty($this->params))
            call_user_func_array(array(new $this->class(new $this->class1, new $this->class2), $this->method), $this->params);
        else
            call_user_func(new $this->class(new $this->class1, new $this->class2), $this->method); // line 55
    }
    else
    {
        if(!empty($this->params))
            call_user_func_array(array(new $this->class, $this->method), $this->params);
        else
            call_user_func(array(new $this->class, $this->method));  
    }

代码新更新:

if(!empty($this->model) && !empty($this->view))
{
    if(!empty($this->params))
    {
        call_user_func_array(array(new $this->view(new $this->controller, new $this->model), $this->action), $this->params);
    }
    else
    {
        call_user_func(new $this->view(new $this->controller(new $this->model), new $this->model), $this->action);
    }
}
else
{
    if(!empty($this->params))
    {
        call_user_func_array(array(new $this->controller, $this->action), $this->params);
    }
    else
    {
        call_user_func(array(new $this->controller, $this->action));
    } 
}

我正在使用控制器模型的Type Hinting insde并查看和解析上述代码中每个变量的正确args,并在每个类中定义了正确的类型提示。 我想用上面的代码实现的是:

$model = new Model();
$controller = new Controller($model);
$view = new View($controller, $model);

我遇到错误:

call_user_func() expects parameter 1 to be a valid callback, no array or string given

更新 忘了发布我遇到错误的确切行

call_user_func(new $this->view(new $this->controller(new $this->model), new $this->model), $this->action);

1 个答案:

答案 0 :(得分:2)

$this->classInvoice\Invoice,该类的构造函数采用Invoice\Data类型的参数。

构造new $className不会将参数传递给构造函数,因此特定的构造函数无法运行。

使用像new $className(new \Invoice\Data())这样的东西会起作用,但当然只有在你构建Invoice的情况下 - 它在一般情况下没用。

通常,当您动态构建对象时,有两种方法可以:

简单方法

您需要假设构造函数的签名(例如“它必须没有必需的参数”),并且您可以使用new $className()等构造对此假设进行硬编码。

艰难的方式

您需要使用反射来确定构造函数采用的参数。这有点牵扯,它只适用于类型提示参数,但实际上它很容易。困难的部分是在调用构造函数时找到要传递的适当实例。