我认为我的问题是一种noobish,但我不能弄清楚这些东西是如何与PHP工作的。它是一个自动加载的类,我想使用我的日志类。我知道我也可以把$log
作为实例变量,但我想要这样。
namespace Bal'Blub;
$log = new Logger('activities');
$log->pushHandler(new StreamHandler(__DIR__.'/../../log/activties.log', Logger::DEBUG));
$log->debug("is working here");
class Foo {
public function bar() {
global $log;
$log->debug("this is my message");
}
}
我不明白为什么$log
在这种情况下没有价值…
编辑:当然我指的是global
而不是public
。
好的,所以感谢你的代码风格的建议。我很清楚全球化是不好的做法。虽然这不是我的问题。答案是在名称空间范围内也使用global
,这是有意义的,但如果您习惯于PHP脚本编写方法,则有点奇怪。
namespace Bal'Blub;
global $log;
$log = new Logger('activities');
$log->pushHandler(new StreamHandler(__DIR__.'/../../log/activties.log', Logger::DEBUG));
$log->debug("is working here");
class Foo {
public function bar() {
global $log;
$log->debug("this is my message");
}
}
是全局$log。不是公共的$log。
但是要小心。全局变量总是邪恶的。如果确实需要全局变量,至少使用静态变量。
<?php
class Globalholder{
public static $log;
}
Globalholder::$log = new Logger(...);
function foo(){
$log = Globalholder::$log;
$log->logsomething("Hello World");
}
global
关键字,一个类似全局变量的静态类属性,一个单例类…所有这些都可以工作,但是既然我们在使用它,为什么不尝试避免不良实践并使用DI呢?
现在,您的Foo类与Logger类紧密耦合,这可能会使维护变得困难,无论何时,有一天,您要更改所有对Logger类的引用。
为什么不写一些更简单的:
class Foo
protected $logger;
public function __construct(Logger $logger)
{
$this->logger = $logger;
}
public function bar($string)
{
$this->logger->debug($string);
}
}
$log = new Logger('activities');
$foo = new Foo($log);
$foo->bar("test");
这样您就解耦了(我知道这段代码可以做得更好)这两个类,并且您还通过传递模拟Logger对象使代码易于测试。