2009-08-24 67 views
0

我有我的自動加載一個問題:PHP自動加載磁帶機:忽略不存在包括

public function loadClass($className) { 
    $file = str_replace(array('_', '\\'), '/', $className) . '.php'; 
    include_once $file; 
} 

正如你所看到的,這是很簡單的。我只是推斷出這個類的文件名並嘗試包含它。我雖然有一個問題;當試圖加載一個不存在的類時,我得到一個異常(因爲我有一個拋出異常的錯誤處理程序)。這很不方便,因爲當您在不存在的類上使用class_exists()時它也會被觸發。你不想在那裏發生異常,只是返回一個「假」。

我在前面加入了一個@(禁止所有錯誤),解決了這個問題。然而,這樣做的一大缺點是,這個包含的任何分析器/編譯器錯誤(這是致命的)都不會出現(即使在日誌中也是如此),導致很難發現錯誤。

什麼是同時解決這兩個問題的最佳方法?最簡單的方法是將包括在自動裝(僞)是這樣的:

foreach (path in the include_path) { 
    if (is_readable(the path + the class name)) readable = true; 
} 
if (!readable) return; 

但我擔心性能那裏。會傷害很多嗎?


(解決)發這樣的:

public function loadClass($className) { 

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';  
    $paths = explode(PATH_SEPARATOR, get_include_path()); 
    foreach ($paths as $path) { 
     if (is_readable($path . '/' . $file)) { 
         include_once $file; 
         return; 
        } 
    } 

} 

回答

0

它只會被調用每班一次,所以性能不應該是一個問題。

0
public function loadClass($className) { 
    $file = str_replace(array('_', '\\'), '/', $className) . '.php'; 
    if(is_readable($file)) 
     include_once $file; 
} 

is_readable不會產生巨大的性能差異。

+0

除了我不得不這樣做對每一個包含路徑(其中有平均約4,我猜)。 – 2009-08-24 18:44:20

0

class_exists()具有第二個參數autoload,當它設置爲FALSE時,將不會觸發非易失類的自動裝載器。

+0

我知道,如果我把它設置爲false,整個功能對我來說都是無用的。 ;) – 2009-08-24 18:47:58

0

(解決)發這樣的:

public function loadClass($className) { 

    $file = str_replace(array('_', '\\'), '/', $className) . '.php';  
    $paths = explode(PATH_SEPARATOR, get_include_path()); 
    foreach ($paths as $path) { 
     if (is_readable($path . '/' . $file)) { 
         include_once $file; 
         return; 
        } 
    } 

}