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

コントローラー モデルとビューの insde で型ヒンティングを使用して、上記のコードの各 vars に適切な引数を解析し、各クラスで適切な型ヒントを定義しています。上記のコードで達成したいことは次のとおりです。

$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->classでありInvoice\Invoice、そのクラスのコンストラクターは type のパラメーターを取りますInvoice\Data

コンストラクトnew $classNameはパラメーターをコンストラクターに渡さないため、特定のコンストラクターを実行できません。

のようなものを使用するnew $className(new \Invoice\Data())とうまくいきますが、もちろん、構築している場合にのみInvoice-- 一般的な場合には役に立ちません。

一般に、オブジェクトを動的に構築する場合、次の 2 つの方法があります。

簡単な方法

コンストラクターの署名について何かを想定する必要があり (たとえば、「必須パラメーターを持たない必要がある」など) new $className()、.

難しい方法

リフレクションを使用して、コンストラクターが受け取るパラメーターを決定する必要があります。これは少し複雑で、型ヒント付きのパラメーターに対してのみ機能しますが、実際には簡単な部分です。難しいのは、コンストラクターを呼び出すときに渡す適切なインスタンスを見つけることです。

于 2013-06-14T09:00:33.697 に答える