你好,我有以下代码,我有以下错误: 任何想法怎么做?
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);
答案 0 :(得分:2)
$this->class
为Invoice\Invoice
,该类的构造函数采用Invoice\Data
类型的参数。
构造new $className
不会将参数传递给构造函数,因此特定的构造函数无法运行。
使用像new $className(new \Invoice\Data())
这样的东西会起作用,但当然只有在你构建Invoice
的情况下 - 它在一般情况下没用。
通常,当您动态构建对象时,有两种方法可以:
简单方法。
您需要假设构造函数的签名(例如“它必须没有必需的参数”),并且您可以使用new $className()
等构造对此假设进行硬编码。
艰难的方式。
您需要使用反射来确定构造函数采用的参数。这有点牵扯,它只适用于类型提示参数,但实际上它很容易。困难的部分是在调用构造函数时找到要传递的适当实例。