PHP和一些全局变量

时间:2009-08-27 10:36:07

标签: php require-once

require_once'modules/logger.php';                                                         
$Logger = new Logger();

require_once 'templates/list.php';
$Templates = new templatesList();

require_once 'widgets/list.php';
$Widgets = new widgetsList();

我在$Loggertemplates/list.php中使用widgets/list.php。 我在$Templates中使用/widgets/list.php

上面的代码抛出了这个错误:

  

注意:未定义的变量:Logger in   第99行.../templates/list.php   致命错误:调用成员函数   toLog()在非对象中   第99行.../templates/list.php

UPD 这是第99行:

$Logger->toLog( $contentData );

2 个答案:

答案 0 :(得分:2)

如果要在对象方法中使用$Logger,则需要在该方法中将其标记为全局。如果不这样做,您将最终创建一个新的本地$ Logger变量。我怀疑这就是问题所在。例如:

class templatesList {
    public function __construct() {
        global $Logger;
        //now we can use $logger.
    }
}

但是,将$ Logger传递给需要使用它的每个对象的构造函数可能会更好。全局变量通常不被视为良好实践。

class templatesList {
    protected $Logger;
    public function __construct(Logger $Logger) {
        //now we can use $logger.

        //store reference we can use later
        $this->Logger = $Logger;
    }

    public function doSomething() {
        $this->Logger->log('something');
    }
}

new templatesList($Logger);

答案 1 :(得分:0)

你确定你没有在/templates/list.php的开头某处取消$ Logger吗?

在初始化之后和使用之前尝试var_dumping()$ Logger。