2016-04-15 150 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的类的实例,并且您尝试调用未由该参数为实例的类实现的方法的。

此外,接口允许强制类实现与接口实现的方法相同的方法,这是类之间的一种契约。
所以你可以有几个不同的类来实现相同的接口,所以要尊重类构造函数的第一个参数的类型提示。

相关问题