2011-07-11 51 views
2

我使用PHP的require_once()方法將一個PHP腳本包含到另一個腳本中。該腳本包含一個類,TemplateAdmin,其本身實例化腳本之後,像這樣:PHP方法消失?

class TemplateAdmin { 
// Class body... 
} 

$templateAdmin = new TemplateAdmin(); 

這是工作了一段時間的罰款。但是,我採用了新的導入技術來包含類和包。我已經測試了這種新技術,它的工作原理!但是,出於某種奇怪的原因,當我需要它們時,我導入的任何類中的方法都不存在。但是,似乎實例變量仍然存在。

例如,當與此絕對路徑一類被稱爲:

require_once("C:\wamp\www\wave_audio\system\server\templates\TemplateAdmin.php"); 

...我得到這個錯誤在調用堆棧:

Fatal error: Call to undefined method stdClass::top() in C:\wamp\www\wave_audio\cms\index.php on line 189 

此錯誤是指我使用TemplateAdmin類中的top()方法。

有沒有人有任何想法,爲什麼發生這種情況???如果這有幫助,我一直在使用require_once(),我在Windows XP Media Center機器上運行PHP 5.3.5。

謝謝你的時間!

+2

這將是最好的,如果你能顯示完整的相關源代碼(你在哪裏做的要求,你在哪裏叫top())... –

+0

你可以減少你的代碼下降到最低l測試用例,然後在這裏發佈? –

+0

包含整個腳本太長了,但我可以向你保證腳本*在調用該方法之前被導入。它起作用,因爲我嘗試在包含文件中回顯一些文本,該文本顯示在屏幕上我收到錯誤之前。我會盡量將其簡化爲一個簡化的版本...... :) –

回答

1

假設你不想使用全局變量,這裏只需要一些改變。

TemplateAdmin.php:

class TemplateAdmin { 
// Class body... 
} 

return new TemplateAdmin(); 

返回進口包括一次:

function import($classes) { 
//Convert ECMAScript style directory structures to Unix style 
    $address = str_replace(".", "/", $classes); 
    $address = INSTALL_ROOT . "system/server/" . $address . ".php"; 

    if (file_exists($address) && is_file($address)) { 
    return require_once($address); 
    } else { 
    die(""" . $classes . "" does not link to an existing class"); 
    } 
} 

分配變量:

$adminTemplate = import('templates.TemplateAdmin'); 
+0

嗯......謝謝玻璃機器人!我得看看這個。理想情況下,我希望使用'import('templates.TemplateAdmin')'作爲'require_once(/ *完整路徑* /)'的快速替代方法,而不將其內容分配給變量,並使其具有完全相同的方式。你知道那種事是可能的嗎? –

0

我有一種感覺,你的PHP錯誤信息是準確的。我知道你的精簡版,你拼湊在一起,你怎麼確信它的設置,但它顯然不是一個直接複製/粘貼,因爲它是這樣的:

class TemplateAdmin { 
    public function top() { 
    //The "top" method... 
    } 
} 

因此,錯誤消息說,法「頂「 沒有定義。如果它沒有正確包含文件,它會告訴你實例化的類不存在。該方法不存在於您認爲它的類中,或者該方法在該對象實例中的某處未被設置。相信你的錯誤信息。