根据您在Github上的示例,您在构造函数中注入了默认值为 NULL 的记录器接口。
<?php
use Psr\Log\LoggerInterface;
class Foo
{
private $logger;
public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger;
}
public function doSomething()
{
if ($this->logger) {
$this->logger->info('Doing work');
}
// do something useful
}
}
表示某些东西有一个你可以实现的 LoggerPsr\Log\LoggerAwareInterface
和Psr\Log\LoggerAwareTrait
.
重新构建示例代码,它看起来像这样
<?php
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
class Foo implements LoggerAwareInterface
{
use LoggerAwareTrait;
public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger;
}
public function doSomething()
{
if ($this->logger) {
$this->logger->info('Doing work');
}
// do something useful
}
}
那很好而且工作,但如果我会这样做
<?php
use Psr\Log\LoggerInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
class Foo implements LoggerAwareInterface
{
use LoggerAwareTrait;
public function __construct(LoggerInterface $logger = null)
{
$this->setLogger( $logger );
}
public function doSomething()
{
if ($this->logger) {
$this->logger->info('Doing work');
}
// do something useful
}
}
它最终会must be an instance of Psr\Log\LoggerInterface, null given
出错,因为接口中的方法声明上没有 NULL 默认值。当然,可以通过使用 if 或传递 a 来防止此错误,NullLogger
但这很奇怪。
Beeing 能够在构造函数中传递一个可选的 Logger 实例会让我认为我可以稍后通过将 Logger 设置为 NULL 值来更改该实例。当然这是一个示例代码,但让我们看看问题
public function __construct(LoggerInterface $logger = null);
public function setLogger(LoggerInterface $logger);
所以基本上我可以将 NULL 引用传递给构造函数,但我无法调用 setter,因为不允许使用 NULL。Psr\Log\LoggerAwareInterface
如果看起来像这样就更好了
<?php
namespace Psr\Log;
/**
* Describes a logger-aware instance.
*/
interface LoggerAwareInterface
{
/**
* Sets a logger instance on the object.
*
* @param LoggerInterface $logger
*
* @return void
*/
public function setLogger(LoggerInterface $logger = null);
}
所以请告诉我这个决定的背景?