2010-11-20 76 views
0

我使用自動加載器來包含類。我現在正在使用「glob」來讀取不同的目錄,並將它們推入一個數組中。有更好的解決方案嗎?懶惰類包括PHP

$path = './'; 

$files = array_merge(
glob($path.'includes/classes/system/*.class.php'), 
glob($path.'includes/classes/system/baseclasses/*.class.php'), 
glob($path.'includes/classes/system/systementities/*.class.php')); 

編輯:

我使用這個自動加載一個類的內部。問題是我必須搜索帶有glob的文件。有沒有更快的方法來做到這一點?

回答

1

只要您嘗試使用PHP不知道的類,就會觸發自動加載。如果您使用include/require,PHP將瀏覽您在PHP.ini中爲您的include_path指定的所有目錄,因此應該沒有理由使用glob。根據你的情況,應該足以置include_path

/path/to/includes/classes/system/ 

最快辦法,包括文件是使用一個class2file map。但是,這需要您創建此類地圖並在修改應用程序時保持其更新。

+0

但在這裏我也需要文件。所以上面的代碼沒有改變。我已經使用spl_autoload_register(如標籤所示) – Simon 2010-11-20 18:35:38

+0

你是什麼意思「我需要這些文件」?如果因爲認爲在include_path上搜索速度很慢而需要映射,請考慮使用任何策略生成映射並將其緩存到某處(簡單文件,APC,memcache)。 – timdev 2010-11-20 19:06:18

+0

聽起來更好,我會試試看! – Simon 2010-11-21 00:01:21

1

PHP已經爲你解決了這個問題。使用PHP的built-in autoloader。當語言/框架爲您提供時,切勿自行推出自己的產品。

0
function __autoload($class) { 
    $classfile = $class.'.class.php'; 
    $path = './includes/classes/system/'; 
    if (is_file($path.$classfile)) require_once($path.$classfile); 
    if (is_file($path.'baseclasses/'.$classfile)) require_once($path.'baseclasses/'.$classfile); 
    if (is_file($path.'systementities/'.$classfile)) require_once($path.'systementities/'.$classfile); 
} 

......這仍然不是最偉大的方式,但它讓你使用glob()。如果你通常加載所有的系統,那麼在boot/config腳本中應該有一個硬編碼的require()列表。關於如何組織和獲取類文件有很多選項。爲了減少搜索腳本的時間,您可以將您的文件樹視爲一個界面。爲了簡單起見,您可以將所有非必需類放在同一個文件夾中,將is_file()調用減少爲一個。

在我的系統中,我有對象類分組在文件夾中與他們各自的控制腳本和意見。我的__autoload()函數有一個更簡單的工作 -

$classfile = $path.$class.'/'.$class.'_class.php'; 
if (is_file($classfile)) require_once($classfile); 
+0

我使用單個類來存儲文件,所以我只需要執行isset檢查而不是is_file檢查 – Simon 2010-11-21 00:00:46