将一个类注入另一个类


Injecting a class into another class

我有一个类InjectedClass,它有一个方法someMethod。这门课需要三个参数。我需要另一个类Myclass中方法的输出。基本上,我需要通过Myclass中的构造函数将相同的三个参数传递给注入的类,因为它确实返回了一些数据。

问题是我收到一个错误,指出Myclass构造函数中的第四个参数(注入的类)应该是injectedClass的实例,但它是空的!请参见示例。

我认为问题是Injected类在没有params的情况下初始化,因此没有初始化,因此为空。此外,如果我尝试将类直接注入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
    }
}

MyClass在构造中只需要一个参数-InjectedClass instansce,它就可以工作了。即

$injected = new Injected($var1, $var2, $var);
$my = new MyClass($injected);
$my->myfunction(); // will work correctly now

我会重新思考如何尝试使用依赖项注入。我脑海中最简单的方法是在InjectedClass中创建setter,并在设置构造中的类变量时设置它们。类似于:

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

当然,你可以稍微清理一下,但通过这种方式注射,你应该能够避免你面临的问题。

一切都取决于你想要实现什么,但基本上在中

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,3传递给MyclassInjectedClass,如果这些值相同,这可能不是很方便。

因此,您可以将代码更改为:

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

其中CCD_ 10的对象可以将这些参数返回给CCD_。