0

メソッドsomeMethodを持つクラスInjectedClassがあります。クラスは 3 つのパラメーターを取ります。別のクラスMyclassのメソッドの出力が必要です。基本的に、 Myclassのコンストラクターを介して同じ 3 つのパラメーターを、注入されたクラスに渡して、データを返す必要があります。

問題は、Myclass コンストラクターの 4 番目のパラメーター (注入されたクラス) は、injectedClass のインスタンスであると予想されるが、空であるというエラーが表示されることです。例を参照してください。

問題は、Injected クラスがパラメーターなしで初期化されているため、初期化されず、空であるということだと思います。また、クラスをmyfunctionメソッドに直接注入しようとすると、多かれ少なかれ同じ結果が得られます。この混乱を解決するにはどうすればよいですか?

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
        $this->injectedclass = $injectedclass;
    }

    public function myfunction()
    {
        return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function __construct($var1, $var2, $var3)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function someMethod()
    {
        // do stuff
    }
}
4

3 に答える 3

0

依存性注入を使用しようとしている方法を再考します。私の頭の中で最も簡単な方法は、 InjectedClass 内にセッターを作成し、コンストラクトでクラス変数を設定するときにそれらを設定することです。何かのようなもの:

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
        $this->injectedclass = $injectedclass;
        $this->injectedclass->setParams($this->var1, $this->var2, $this->var3);
    }

    public function myfunction()
    {
        return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function setParams($var1, $var2, $var3) {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function someMethod()
    {
        // do stuff
    }
}

もちろん、これを少しきれいにすることもできますが、この方法で注入を行うことで、直面している問題を回避できるはずです。

于 2014-09-19T20:55:50.153 に答える
0

すべては達成したいものに依存しますが、基本的には

public function myfunction()
{
   return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
}

$this->injectedclassすでにプロパティが初期化されているオブジェクトであるため、これらのパラメーターを渡す必要はありません。したがって、コードは次のようになります。

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
        $this->injectedclass = $injectedclass;
    }

    public function myfunction()
    {
        return $this->injectedclass->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function __construct($var1, $var2, $var3)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function someMethod()
    {
        // do stuff
        echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
    }
}

$m = new Myclass(1,2,3, new InjectedClass(1,2,3));
$m->myFunction();

ただし、インスタンスを作成するときにわかるように、両方にMyclass引数を渡す必要があり、それらの値が同じ場合、これはあまり便利ではない可能性があります。1,2,3MyclassInjectedClass

したがって、コードを次のように変更できます。

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
        $this->injectedclass = $injectedclass;
        $this->injectedclass->setParams($var1, $var2, $var3);
    }

    public function myfunction()
    {
        return $this->injectedclass->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function setParams($var1, $var2, $var3)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function someMethod()
    {
        // do stuff
        echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
    }
}

$m = new Myclass(1,2,3, new InjectedClass());
$m->myFunction();

したがって、引数のみを に渡し、引数Myclassを に設定しますInjectedClass。ただし、このメソッドを使用すると、InjectedClass クラスのオブジェクトを作成したとしても、パラメーターを設定するためにメソッドも実行する必要があるsetParamsため、最適なソリューションではありません。

より良いのは次のとおりです。

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct(InjectedClass $injectedclass)
    {
        $this->injectedclass = $injectedclass;
        list ($this->var1, $this->var2, $this->var3) = $this->injectedclass->getParams();
    }

    public function myfunction()
    {
        return $this->injectedclass->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function __construct($var1, $var2, $var3)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function getParams() {
        return array ($this->var1, $this->var2, $this->var3);
    }

    public function someMethod()
    {
        // do stuff
        echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
    }
}

$m = new Myclass(new InjectedClass(1,2,3));
$m->myFunction();

where object ofInjectedClassは、これらのパラメータを object of に返すことができますMyclass

于 2014-09-20T19:00:46.263 に答える