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


How to call methods that I'm not sure are available? (optional dependencies)

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

你可以实现一个"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。

最后,您还可以决定日志记录与您的类没有直接关系,这是可以留给用户负责的行为。您可以使用 Events 或模板方法模式提供扩展点(如果您有兴趣,请参阅我的问题:我应该为开源库使用事件还是"模板方法"模式?

总而言之,我会说这取决于用例:你记录了很多吗? "日志记录"是您提供的功能的一部分吗? 还是一个单独的问题?

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

<?php
use 'PSR'Log'NullLogger