你有沒有考慮過你的班級位置的明確定義?有時候將相關的類分組很有意義。
這是處理它的經過驗證的方法。
此代碼放置在auto_prepend_file
(或包含第一)
class Import
{
public static $_AutoLoad = array();
public static $_Imported = array();
public static function Load($sName)
{
if(! isset(self::$_AutoLoad[$sName]))
throw new ImportError("Cannot import module with name '$sName'.");
if(! isset(self::$_Imported[$sName]))
{
self::$_Imported[$sName] = True;
require(self::$_AutoLoad[$sName]);
}
}
public static function Push($sName, $sPath)
{
self::$_AutoLoad[$sName] = $sPath;
}
public static function Auto()
{
function __autoload($sClass)
{
Import::Load($sClass);
}
}
}
而且在引導文件,定義類,它們是在什麼文件。
//Define autoload items
Import::Push('Admin_Layout', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient', App::$Path . '/PHP/FileClient.php');
最後,通過調用
Import::Auto()
啓用自動加載
其中一個很好的事情是,你可以定義「模塊」:
Import::Push('MyModule', App::$Path . '/Module/MyModule/Init.php');
,然後在需要時明確加載它們:
Import::Load('MyModule');
而最好的部分之一是,你可以有更多的Import::Push
模塊中的行,它將在運行時定義它的所有類。
我建議你也看看梨/ Zend的編碼標準的文件命名約定爲提供一些好的指引。恕我直言,在文件名中使用.class.php是多餘的,不鼓勵。你可以使用下面的東西來自動加載:require(str_replace('_',DIRECTORY_SEPARATOR,$ className);使其變得簡單易行 – Tres 2009-09-18 02:09:28
順便說一句,每個文件有多個類一般都不被認爲是代碼可維護性的好習慣 – Tres 2009-09-18 02:13:04
哈哈,對不起關於所有的評論,但fyi,我的上面的「require」行是不正確的語法。它應該是:require(str_replace('_',DIRECTORY_SEPARATOR,$ className)。'.php');應該有單元測試我的評論; ) – Tres 2009-09-18 02:16:33