0

当我一直在阅读文档和示例时,我发现 aLoggerInterface是通过依赖项的构造函数传递的,如此处所示,这允许依赖项输出到控制台。

我的问题是:

  1. 如果我有多个类,我是继续在构造函数中传递 aLoggerInterface还是有更好的做法?或者我什至不应该将它传递给这些课程?

  2. 如果我想让一个类在没有 a 的情况下工作LoggerInterface,我是否总是只检查是否$this->logger为 null 然后采取相应的行动?

例如,

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);
    }
}
4

1 回答 1

0

在这种情况下,使用的LoggerInterface只不过是一个类型提示。

如果您传递一个未实现此接口的类(或其他任何东西)的实例,例如:

$objectOne = new ObjectOne('randomstring');

将抛出一个错误,指出 的第一个参数ObjectOne必须是LoggerInterface给定字符串的实例。

你可以完美地删除这个类型提示,但是你的类可以用任何类型的第一个参数来实例化。
因此,删除此检查可能会产生意外错误,例如,如果第一个参数不是实现 的类的实例LoggerInterface,并且您尝试调用该参数是其实例的类未实现的方法。

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

于 2016-04-15T16:24:26.110 回答