2014-09-19 205 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反對。