当我阅读文档和示例时,我发现LoggerInterface
通过依赖项的构造函数传递为seen here,这允许依赖项输出到控制台。
我的问题是:
如果我有多个班级,我会继续在构造函数中传递LoggerInterface
,还是有更好的练习?或者我是否应该将它传递给这些课程?
如果我想让课程在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 :(得分:0)
在这种情况下,使用LoggerInterface
只不过是类型提示。
如果传递未实现此接口的类(或其他任何内容)的实例,例如:
$objectOne = new ObjectOne('randomstring');
将抛出一个错误,指出ObjectOne
的第一个参数必须是LoggerInterface
的实例,给定字符串。
您可以完美地删除此类型提示,但是您的类可以使用任何类型的第一个参数进行实例化。
因此,删除此检查可能会产生意外错误,例如,如果第一个参数不是实现LoggerInterface
的类的实例,并且您尝试调用参数所在的类未实现的方法。的实例。
此外,一个接口允许强制类实现与接口实现的方法相同的方法,它是类之间的一种契约。
因此,您可以使用几个不同的类来实现相同的接口,因此请尊重类构造函数的第一个参数的类型提示。