为什么这个全局函数不能访问我的全局对象?

时间:2013-08-31 11:54:49

标签: php global-variables

这是全球范围内的代码:

try {
    $Core = new Core;
} catch(Exception $e) {
    echo 'We\'re Sorry, but an error has occurred: <br /> '.$e. "\n";
}

function PP($Object){
    global $Core;
    echo '<pre>'.$Core->Tools()->DebugPrint($Object).'</pre>';
}

我得到了:

Call to a member function Tools() on a non-object

这没有任何意义。为什么PP函数无法访问全局$Core对象?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

上面的源代码是index.php文件的全部内容,直接在浏览器中加载。肯定有更多的代码,但上面的代码绝对是在全球范围内。此外,没有其他代码在全局范围内运行,因此无法覆盖Core。

Core对象构造函数开始应用程序执行并调用其他核心方法,这些方法调用其他方法,自动加载类,使用类等。但是,因为在其中一个类中调用PP()发生在完成之前在Core构造函数中,Core对象保持为null,直到构造函数完成执行(仅在应用程序完成时才会发生)。解决这个问题的方法是将所有Core类的初始化从构造函数中移出,并转移到init()方法中。

这允许完全创建Core(使用空构造函数),因此当函数尝试执行它时,变量不为null,现在在Init()的范围内,而不再在__construct()中。

新代码:

try{
   $Core = new Core;
   $Core->Init();
}
catch(Exception $e){
   echo 'We\'re Sorry, but an error has occured: <br /> '. $e. "\n";
}


function PP($Object){
   global $Core;
   echo '<pre>'.$Core->Tools()->DebugPrint($Object).'</pre>';
}