2008-12-18 141 views
3

我正在編寫一個考慮可測試性的PHP應用程序,所以我的類總是在它們的構造函數中詢問它們依賴的「協作對象」,就依賴注入模式而言。給PHP對象類型參數一個默認值

這樣,我就可以在我的單元測試中通過模擬或測試實現。

我想實現的目的是爲了能夠實例化一個具有傳遞給它的構造函數參數的空值的類,以便觸發一個爲每個協作者實例化一個默認實現類的回退機制。

因爲在PHP中不能給出對象類型參數的默認值,所以我必須在構造函數中完成它。以下代碼是我目前使用的方法示例:

class Engine 
{ 
    private $loader; 
    private $logger; 

    public function __construct(ResourceLoader $loader = null, Logger $logger = null) 
    { 
     if ($loader == null) $loader = new DefaultResourceLoader; 
     if ($logger == null) $logger = new DefaultLogger; 

     $this->loader = $loader; 
     $this->logger = $logger; 
    } 
} 

您對此有何看法?我應該使用IoC容器嗎?還是有另一種將對象類型參數賦予默認值的方法?

+0

在這種情況下,您可以使用我的小型庫[ValueResolver](https://github.com/LapaLabs/ValueResolver)來更緊湊地執行此操作。 – 2015-07-09 10:48:26

回答

2

當然,您最好使用IoC/DIP容器來完成這項工作。上面的代碼(if語句)增加了類的耦合。客戶端類(Engine)不應該關心裝載器和記錄器角色的實現。這是工廠或DIP容器的工作知道這一點。通過在您的代碼中放入具體的類名,並將這些類綁定在一起,使您的代碼更加靈活(敏捷),可重用性更低,因此可維護性更低。

+0

感謝您的回答。你有一個好的PHP容器的任何推薦? – Franck 2008-12-18 16:06:32

0

你可以用我的小圖書館ValueResolver在這種情況下,例如:

$logger = ValueResolver::resolve($logger, new DefaultLogger); 

,不要忘記使用命名空間use LapaLabs\ValueResolver\Resolver\ValueResolver;

也有能力類型轉換,例如,如果你的變量值應該是integer,所以用這個:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6 
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value) 

檢查docs更多的例子