访问方法中的全局变量

时间:2014-06-08 10:45:30

标签: php methods global var

我认为我的问题有点像诺贝尔,但我无法弄清楚这些东西是如何与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

3 个答案:

答案 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对象来轻松测试代码。