Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何调用I';我不确定有没有空?(可选依赖项)_Php_Oop_Language Agnostic_Dependency Injection - Fatal编程技术网

Php 如何调用I';我不确定有没有空?(可选依赖项)

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

假设您有一个符合PSR logger接口标准的类,但您希望它也能被不需要日志记录或不需要PSR logger的人使用。我很清楚对记录器使用方法注入(类似于
函数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来记录一些东西。