2013-08-31 88 views
0

這是代碼,在全球範圍內:爲什麼這個全局函數不能訪問我的全局對象?

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對象?

+0

你在哪裏定義$核心對象? –

+0

@cyber_rookie查看代碼的第二行.. –

+0

唯一的解釋是「這是全局範圍內的代碼:」 - 它不在全局範圍內 – zerkms

回答

0

我找到了解決方案。

上面的源代碼是index.php文件的全部內容,直接在瀏覽器中加載。當然有更多的代碼,但上面的代碼絕對在全球範圍內。另外,沒有其他代碼在全局範圍內運行,因此Core不能被覆蓋。

Core對象構造函數開始執行應用程序並調用其他調用其他方法,自動加載類,使用類等的核心方法。但是,由於在其中一個類內調用PP()會在完成之前發生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>'; 
} 
相關問題