-1

您好,我有以下代码,并且出现以下错误:有什么想法吗?

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

我在控制器模型和视图中使用类型提示,并将正确的参数解析为上述代码中的每个变量,并在每个类中定义了正确的类型提示。我想用上面的代码实现的是:

$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);
4

1 回答 1

2

$this->classis Invoice\Invoice,并且该类的构造函数采用类型的参数Invoice\Data

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

使用类似的东西new $className(new \Invoice\Data())会起作用,但当然只有在你正在构建的情况下Invoice——在一般情况下它是没用的。

一般来说,当您动态构造对象时,您可以采用两种方法:

最简单的方法

您需要对构造函数的签名进行一些假设(例如“它必须没有必需的参数”),并且您可以使用诸如new $className().

艰难的路

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

于 2013-06-14T09:00:33.697 回答