我将尝试通过一个例子解释我的问题:
我们有1个主要的PHP脚本,它实例化了一些类/对象,我们的项目特定代码。我们想要为所有这些类添加一个记录器。这样做的常用方法是什么?为了一个例子,我们想要Monolog,它应该被实例化:
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
选项#1:我们每班可以有1个独白。我猜不是最好的选择。
选项#2:从主脚本中,有一个$ log对象,并将其传递给每个被调用对象(然后在每个对象__construct中将$ log分配给私有变量$ class_logger然后使用它:
例如,主脚本:
$logger = Logger::getLogger("main");
$logger->info("This is an informational message.");
$logger->warn("I'm not feeling so good...");
$test_run = new called_object($logger);
$test_run->call_it();
called_object类:
class called_object {
private $logger;
public function __construct($log)
{
$this->logger = $log;
}
public function call_it()
{
$this->logger->warn("from called_object!");
}
}
第二个似乎更好,但我觉得它不太实际,也许我在这里错过了一些东西?
答案 0 :(得分:1)
第二个选项名为{{3}},是首选。它为您提供单点配置 - 例如,如果您想要更改记录器的行为方式,您只需要在一个位置执行此操作。它还允许更容易的测试,例如,您可能有一个单独的测试配置,用于配置空记录器。