2014-06-08 173 views
0

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

$ log'global'在哪里?我只看到一个公共类属性,从来没有分配过。 Foo如何知道$ log是Logger类的一个实例? –

+0

'公共'到'全球' –

+0

对不起,我的意思是'全球'。 – uphill

回答

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"); 
    } 
} 
0

它是全局$ log。不是公共$日志。

但要小心。全局变量总是邪恶的。如果你真的需要全局变量,至少应该使用静态变量。

<?php 
class Globalholder{ 
    public static $log; 

} 
Globalholder::$log = new Logger(...); 


function foo(){ 
    $log = Globalholder::$log; 
    $log->logsomething("Hello World"); 
} 
0

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"); 

这样,你去耦(我知道这个代码可以更好地做)这两个类,而你也通过传递使代码容易可验证一个模拟记录器对象。

+0

完全同意,但为什么我的示例在这里不起作用?为什么我不能在这里访问变量? – uphill

+0

那么我的问题的答案是,你需要一个'全局$日志;'也在文件的顶部? – uphill

+0

它应该是这样的,但是,为什么坚持'全球'? –