如何调用我不确定的方法? (可选的依赖项)

时间:2013-09-17 14:57:17

标签: php oop language-agnostic dependency-injection

假设您有一个符合PSR记录器接口标准的类,但您希望它也可供那些不需要记录或不需要PSR记录器的人使用。我很清楚使用方法注入记录器(类似function setLogger(Psr\Log\LoggerInterface $logger){...})。现在我想知道如果我不能确定是否指定了logger类,如何调用logger的方法。其中一个解决方案是创建一个可以作为记录器代理的类,但我不确定这是否是合适的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以实现“NullLogger”并将其作为默认记录器:

class NullLogger implement LoggerInterface
{
    public function error($message, $context = [])
    {
        // do nothing
    }
    // ...
}

class MyClass
{
    private $logger;

    public function __construct(LoggerInterface $logger = null)
    {
        $this->logger = $logger ?: new NullLogger();
    }

    public function doSomething()
    {
        $this->logger->info('');
        // ...
    }

    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}

我也会认真考虑这个好人:

if ($this->logger) {
    $this->logger->...
}

(如果它没有在任何地方使用),因为它更轻量级。

但第一个解决方案绝对是有效的IMO。

最后,您还可以决定日志记录与您的类无直接关系,而这种行为可能留给用户的责任。您可以使用事件或模板方法模式提供扩展点(如果您感兴趣,请参阅我的问题:Should I use events or the "template method" pattern for an open source library?)。

总结一下,我会说这取决于用例:你记录了很多吗?是“记录”您提供的功能的一部分?或者它是一个单独关注的问题?

答案 1 :(得分:1)

事实证明,PSR标准定义了一个可用于此目的的空记录器。

<?php
use \PSR\Log\NullLogger