Php 如何调用I';我不确定有没有空?(可选依赖项)
假设您有一个符合PSR logger接口标准的类,但您希望它也能被不需要日志记录或不需要PSR logger的人使用。我很清楚对记录器使用方法注入(类似于Php 如何调用I';我不确定有没有空?(可选依赖项),php,oop,language-agnostic,dependency-injection,Php,Oop,Language Agnostic,Dependency Injection,假设您有一个符合PSR logger接口标准的类,但您希望它也能被不需要日志记录或不需要PSR logger的人使用。我很清楚对记录器使用方法注入(类似于函数setLogger(Psr\Log\LoggerInterface$logger){…})。现在我想知道如果我不能确定是否指定了logger类,如何调用logger的方法。解决方案之一是创建一个类作为记录器的代理,但我不确定这是合适的解决方案。您可以实现一个“NullLogger”,并将其作为默认记录器: class NullLogger
函数setLogger(Psr\Log\LoggerInterface$logger){…}
)。现在我想知道如果我不能确定是否指定了logger类,如何调用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)看来绝对有效
最后,您还可以确定日志记录与您的类没有直接关系,这是可以由用户负责的行为。您可以使用事件或模板方法模式提供扩展点(如果您感兴趣,请参阅我的问题:)
总而言之,我想说这取决于用例:您经常记录日志吗?“日志记录”是您提供的功能的一部分吗?或者它显然是一个单独的问题?您可以实现一个“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)看来绝对有效
最后,您还可以确定日志记录与您的类没有直接关系,这是可以由用户负责的行为。您可以使用事件或模板方法模式提供扩展点(如果您感兴趣,请参阅我的问题:)
总而言之,我想说这取决于用例:您经常记录日志吗?“日志记录”是您提供的功能的一部分吗?或者这显然是一个单独的问题?事实证明,PSR标准定义了一个空记录器,可用于此目的
<?php
use \PSR\Log\NullLogger
事实证明,PSR标准定义了一个可用于此目的的空记录器
<?php
use \PSR\Log\NullLogger
你是说每次($this->logger!==null)
都要避免执行if($this->logger!==null)?因为测试是否设置了记录器是一个解决方案。这个问题的表述很奇怪,对此我很抱歉。是的,这正是我想要避免的。我希望代码看起来尽可能简单,而不必检查每次有记录时是否设置了$this->logger。您的意思是希望避免每次都执行if($this->logger!==null)
吗?因为测试是否设置了记录器是一个解决方案。这个问题的表述很奇怪,对此我很抱歉。是的,这正是我想要避免的。我希望代码看起来尽可能简单,而不必检查是否每次都设置了$this->logger来记录一些东西。