2012-12-28 52 views
1

我有index.php文件,在最頂層我定義__autoload魔術功能。__autoload是否會影響包含的文件?

function __autoload($className) { 
    echo "autoloading $className"; 
    require_once('application/models/'.strtolower($className).'.php'); 
} 

然後,我引用由__autoload自動包含的User對象(User.php)。一切正常,直到這一刻。 問題是user.php的引用文件類

 $obj->numberOfUploads = File::countUploadsByUser($obj->ID); 

,並在這一點上引發錯誤

Fatal error: Class 'File' not found in Z:\home\project\www\application\models\user.php on line 19

的事情是,我可以看到輸出

autoloading User

但無法看到任何重新註冊文件。所以,就像看起來一樣,當捕獲對File的引用時,__autoload函數根本不會被調用。試圖將__autoload函數添加到User.php導致有關重新聲明該函數的錯誤。

我很抱歉,如果這個問題被提出之前,我試圖谷歌,並沒有發現任何信息。

乾杯

+0

我認爲這是可能的,你所看到的輸出是假陽性,因爲你被加載'User'腳本時很可能看到的。我剛剛開始學習如何使用命名空間,但我想知道這是否有助於解決這個問題? http://php.net/manual/en/language.namespaces.importing.php –

+0

你是對的 - 只有在包含成功的情況下才顯示輸出。我還沒有處理名稱空間,因爲這是一個相對較新的功能,所以我不能說它是否可以提供幫助。但Fabian Tamp的解決方案訣竅 –

回答

3

從它似乎是當它涉及到定義__autoload兩次許多人都有過類似的問題上autoload in the php manual的意見。

我會建議使用spl_autoload_register用匿名函數來避免多重定義衝突,因爲該頁面的實例1中所示:

// Or, using an anonymous function as of PHP 5.3.0 
spl_autoload_register(function ($class) { 
    include 'classes/' . $class . '.class.php'; 
}); 

而且,你不需要使用require_once(可以只使用require ),因爲如果類已經找到,處理程序將不會再被調用。

嘗試在您的index.php文件中使用spl_autoload_register,如果不起作用,請將User.php也放入User.php

祝你好運!

+0

感謝您的答覆。問題不在於重新定義函數。我想了解__autoload是否可以在它包含的文件中工作。我的意思是,如果不是,那麼這更可能是一個PHP錯誤 –

+0

我也考慮過它......它應該*在包含文件中工作,因爲「當包含文件時,它包含的代碼繼承變量範圍包含的行就是這個行,調用文件中該行可用的任何變量將在被調用的文件中可用,從該點開始「(參見['include'](http://php.net/manual/en /function.include.php) –

+0

是誰寫的[此評論](http://php.net/manual/en/language.oop5.autoload.php#104282)的人似乎有一個類似的問題給你。 –

相關問題