2016-12-24 44 views
1

我做一個簡單的類依賴關係,以免創建多個實例:PHP:如何將參數傳遞到依賴容器

class Container { 

    private static $instance = array(); 

    public function use($class) { 

     if (!isset(self::$instance[$class])) { 

      self::$instance[$class] = new $class(); 

     } 

     return self::$instance[$class]; 

    } 

} 

現在我可以用它喜歡:

$Container = new Container; 

$Class = $Container->use('SomeClass'); 

這將是等價的:

$Class = new Class; 

不過,我將如何修改這個Container類,以便我可以將(未知數量的)參數傳遞給我請求實例的類。就像我必須這樣做:

$Class = new Class($param1, $param2); 
+0

爲什麼不添加'__construct()'? – CodeGodie

+0

@CodeGodie有什麼用途? – JROB

回答

1

這就是我的意思是加一個__construct()。該構造會在您實例化類時運行,並以數組格式獲取您想要的多個參數。

class Container 
{ 
    private static $instance = []; 

    public function useClass($class, $args) 
    { 
     if (!isset(self::$instance[$class])) { 
      self::$instance[$class] = new $class($args); 
     } 
     return self::$instance[$class]; 
    } 
} 

class User 
{ 
    private $name; 
    private $age; 

    public function __construct($args) 
    { 
     $this->name = $args['name']; 
     $this->age = $args['age']; 
    } 

} 


$Container = new Container; 

$args = [ 
    "name" => 'John', 
    "age" => 29 
]; 

$user = $Container->useClass('User', $args); 

var_dump($Container); 
var_dump($user); 
+0

我裝了只有三個小班,我得到致命錯誤:允許的內存字節用盡...... – JROB

0

你是否在做這個測試呢?如果情況並非如此,並且您不知道,PHP中有多個庫可以讓您完全按照您的要求進行操作:依賴注入容器。

作爲一個簡單的,你可以看看Pimple for PHP。一個非常簡單的容器。

如果您想繼續使用您的解決方案,則應該使用類似func_get_args();函數的功能。

+2

我正在看疙瘩,但即使那是比我需要的。我不明白爲什麼這樣一個簡單的課程是不夠的。 – JROB

+0

疙瘩實際上只是一個包含對象的數組,沒有別的東西......所以它實際上和你的類一樣,不要把它看作是一個完整的依賴注入容器。 –