Читая документацию и примеры, я обнаружил, что 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
и вы пытаетесь вызвать метод, который не реализован в классе, экземпляром которого является аргумент.
Кроме того, интерфейс позволяет заставить классы реализовывать те же методы, что и интерфейс, это своего рода контракт между классами.
Таким образом, у вас может быть несколько разных классов, которые реализуют один и тот же интерфейс и учитывают подсказку типа первого аргумента конструктора класса.
Других решений пока нет …