我认为我的问题有点像诺贝尔,但我无法弄清楚这些东西是如何与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
。
答案 0 :(得分:1)
好的,谢谢您的代码风格建议。我很清楚全局变形是不好的做法。虽然这不是我的问题。它的答案是在命名空间作用域中也使用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");
}
}
答案 1 :(得分:0)
它是全球$ log。不公开$ log。
但要小心。全局变量总是邪恶的。如果你真的需要全局变量,至少使用静态变量。
<?php
class Globalholder{
public static $log;
}
Globalholder::$log = new Logger(...);
function foo(){
$log = Globalholder::$log;
$log->logsomething("Hello World");
}
答案 2 :(得分:0)
global
关键字,一个静态类属性,就像一个全局变量,一个单例类...都可以工作,但既然我们在这里,为什么不试图避免不良做法并使用DI? / p>
现在,你的Foo类与Logger类紧密结合,无论什么时候,某天你都要改变所有对Logger类的引用。 / p>
为什么不能更简单:
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对象,你可以通过这种方式解耦(我知道这些代码可以做得更好)两个类,并且你也可以通过传递模拟Logger对象来轻松测试代码。