在阅读文档和示例时,我发现LoggerInterface
通过依赖项的构造函数传递,如图所示,这允许依赖项输出到控制台。
我的问题是:
-
如果我有多个类,我会在构造函数中不断传递
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);
}
}
在这种情况下,LoggerInterface
的使用只不过是一个类型提示。
如果你传递了一个类的实例(或其他任何东西),但它没有实现这个接口,例如:
$objectOne = new ObjectOne('randomstring');
将抛出一个错误,指出ObjectOne
的第一个参数必须是给定字符串的LoggerInterface
的实例。
您可以完全删除此类型提示,但随后可以使用任何类型的第一个参数实例化您的类
因此,删除此检查可能会产生意外错误,例如,如果第一个参数不是实现LoggerInterface
的类的实例,并且您试图调用该参数所属的类未实现的方法。
此外,接口允许强制类实现与接口实现的方法相同的方法,这是类之间的一种契约
因此,您可以有几个不同的类来实现同一个接口,从而尊重类构造函数的第一个参数的类型提示。