2014-09-19 133 views
0

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

问题是我得到一个错误,指出在Myclass构造函数中的第四个参数(注入类)预计是一个injectClass的实例,但它是空的!见示例。

我认为问题是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 
    } 
} 
+0

你怎么调用'Myclass'? – cmorrissey 2014-09-19 20:21:18

+0

$ myclass = new Myclass($ var1,$ var2,$ var3); – Rastur 2014-09-19 20:23:56

回答

0

MyClass只需要构造中的一个参数 - InjectedClass instansce,它已准备好工作。即

$injected = new Injected($var1, $var2, $var); 

$my = new MyClass($injected); 

$my->myfunction(); // will work correctly now 
0

我会重新考虑如何尝试使用依赖注入。最简单的方法就是在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 
    } 
} 

当然,你可以清理它了一点,但通过执行注射这种方式,您应该能够避免你所面临的问题。

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

其中InjectedClass对象可以返回这些参数的Myclass反对。