2016-04-15 7 views
0

ドキュメントと例を読んでいるうちに、LoggerInterfaceが依存関係のコンストラクタを通り、seen hereとして渡され、依存関係が出力されることがわかりましたコンソールに接続します。Symfony Consoleアプリケーションでクラスからログを取る方法

私の質問は以下のとおりです。

  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を実装するクラスのインスタンスではなく、引数がインスタンスであるクラスによって実装されていないメソッドを呼び出そうとすると、予期しないエラーが発生することがありますの。

また、インターフェイスでは、インターフェイスで実装されているものと同じメソッドをクラスに実装することができます。これはクラス間の一種の契約です。
したがって、同じインターフェイスを実装するいくつかの異なるクラスを持つことができ、クラスコンストラクタの最初の引数の型ヒントを尊重することができます。

関連する問題