访问方法中的全局变量


Accessing a Global Variable in a Method

我认为我的问题是一种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对象使代码易于测试。