2016-04-15 108 views
0

當我閱讀文檔和示例時,發現LoggerInterface通過依賴項的構造函數,如seen here,並且這允許依賴項輸出到控制檯。如何從Symfony控制檯應用程序中的類登錄

我的問題是:

  1. 如果我有多個班級做我一直沿着LoggerInterface傳入構造函數或是否有更好的做法呢?或者,我是否應該將它傳遞給這些課程?

  2. 如果我想用LoggerInterface做一個班級工作,我會一直檢查$this->logger是否爲空,然後採取相應措施?

例如,

class ObjectOne { 
    /** 
    * @var LoggerInterface 
    */ 
    private $logger; 

    public function __construct (LoggerInterface $logger) { 
     $this->logger = $logger; 
    } 
} 

class ObjectTwo { 
    /** 
    * @var ObjectOne[] 
    */ 
    private $items; 

    /** 
    * @var LoggerInterface 
    */ 
    private $logger; 

    public function __construct (LoggerInterface $logger) { 
     $this->logger = $logger; 
    } 

    public function addObject() { 
     $this->items[] = new ObjectOne($this->logger); 
    } 
} 

回答

0

在這種情況下,使用LoggerInterface的只不過是一個類型暗示更多。

如果你傳遞一個類(或任何其他)的實例不實現此接口,如:

$objectOne = new ObjectOne('randomstring'); 

錯誤,就會拋出話說,ObjectOne第一個參數必須是實例給出了字符串LoggerInterface

你可以完美地移除這個類型提示,但是你的類可以用任何類型的第一個參數實例化。
因此,刪除此檢查可能會產生意外的錯誤,例如,如果第一個參數不是實現LoggerInterface的類的實例,並且您嘗試調用未由該參數爲實例的類實現的方法的。

此外,接口允許強制類實現與接口實現的方法相同的方法,這是類之間的一種契約。
所以你可以有幾個不同的類來實現相同的接口,所以要尊重類構造函數的第一個參數的類型提示。

相關問題