2009-11-11 90 views
5

在我的服務器端我有一個梨目錄的引用include_path中,在「在/ usr /共享/梨/」。在我的應用我包括來自一個共同的庫文件,生活在「在/ usr /共享/梨/庫/」與require_once 'library/file.php'SPL自動加載的最佳實踐

我使用SPL自動加載最近開始,我注意到,你必須確定與包含該文件的邏輯裝載機功能。我這樣做的第一種方法是試圖包含一個文件並用@將其壓制,以查看它是否會失敗,例如, @include 'library/file.php'然而,我認爲主要是因爲我讀了很多關於@是一個不好的做法,我決定手動完成這項工作,通過PATH_SEPARATOR爆炸get_include_path並查看目錄是否是我想要的,然後做一個file_exists幷包括它。

像這樣:

function classLoader($class) { 
    $paths = explode(PATH_SEPARATOR, get_include_path()); 
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php'; 
    if (file_exists($file) == false) 
    { 
     $exists = false; 
     foreach ($paths as $path) 
     { 
      $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php'; 
      if (file_exists ($tmp)) 
      { 
      $exists = true; 
      $file = $tmp; 
      } 
     } 
     if (!$exists) { return false; } 
    } 
    include $file; 
} 

spl_autoload_register('classLoader'); 

難道我走錯路線?我應該剛剛完成@include業務,還是我正朝着正確的方向去做?

回答

6

Habari project autoloader確實有趣的一件事是將整個類文件列表緩存在內存中,以便每次請求類時都不會執行磁盤搜索。

基本上,你在你的__autoload()裏面聲明瞭一個靜態的類,它包含了所有類文件的一個數組,這些類文件被這個類索引,這會導致它們加載。例如,代碼將使用方向或​​3210生成這個靜態數組:

$class_files = array(
    'user' => '/var/www/htdocs/system/classes/user.class.php', 
); 

然後只需簡單$class_files[$class]以獲得正確的文件。這是很好的,快捷的,因爲它從磁盤目錄中一次全部,而不是生成列表或搜索特定文件名各一個新的類被引用時。 (你會驚訝它有多大的速度差異。)

如果類名不是數組中的一個鍵,你可以拋出一個自定義異常或者生成一個存根/模擬類來返回。另外,如果檢查出Habari的系統自動加載,你會看到在Habari的被自動加載的類實現__static(),這是像靜態類的構造函數。

include_once()是要避免的,如果您檢查了要包含的文件,則不需要@運算符。

1

我親自去使用

function autoload($class) { 
    /* transform class name into filename ... */ 
    include $class; 
} 

的方式即使沒有@以便調試(錯誤關機/登錄生產)

您可能也有興趣在PHP相關的討論開發人員列表:http://marc.info/?t=125787162200003&r=1&w=2

+3

是不是SPL自動加載更實用和現代的方法?或者他們基本上是一樣的東西? – 2009-12-06 07:12:32