繁体   English   中英

在方法中访问全局变量

[英]Accessing a Global Variable in a Method

我认为我的问题有点笨拙,但我无法弄清楚这些东西如何与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对象来使代码易于测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM