2011-09-09 64 views
4

構建庫時,我總是提供一個處理庫自動加載的類Autoloader。自動加載器註冊是這樣的:如何管理依賴關係自動加載

require_once 'path/to/PHP-Parser/lib/PHPParser/Autoloader.php'; 
PHPParser_Autoloader::register(); 

我不知道如何處理它,如果我的圖書館依賴於另一個庫。想象一下PHPParser取決於PHPLexer。現在,使用庫時一個需要寫:

require_once 'path/to/PHP-Lexer/lib/PHPLexer/Autoloader.php'; 
PHPLexer_Autoloader::register(); 

require_once 'path/to/PHP-Parser/lib/PHPParser/Autoloader.php'; 
PHPParser_Autoloader::register(); 

如果有不只是一個依賴更多的還是依賴有依賴自己,這會導致混亂很快。

那麼應該怎麼處理依賴自動加載

我想到的一個想法是,圖書館也應該處理自動加載,因爲它的依賴關係也是如此,但那樣做感覺不對。另一個想法是根本不提供自動加載器,並假定人們使用UniversalClassLoader。這似乎並不正確。

+0

'我有一個想法是,圖書館應處理自動加載它的依賴性過,但只是感覺不對。' - 當所有供應商都支持PSR-0時,這個想法效果不錯 –

回答

8

那麼,有解決這個問題的一些方法,每個都有自己的優點和缺點:

  1. 使用常見的PSR-0自動加載的所有庫,只是註冊的位置其他項目初始化時。

    • 優點:
      1. 很簡單實現
      2. 使用相同的代碼,所以只有一個自動加載磁帶機使用
      3. 你可以在你的bootstrap文件中的所有路徑註冊,所以所有的庫自動加載是在一個地方
    • 缺點定義
      1. 要求所有庫實現與PSR-0兼容的文件結構
      2. 由於應用程序引導程序需要引導應用程序中的所有內容(包括每個單獨的庫),所以抽象層次稍微有點漏洞。
      3. 緊密耦合庫的文件結構,以磁帶自動加載機(如果庫實現了衝突的新的文件,它會破壞你的自動加載,即使他們的工作文件)
  2. 定義自定義自動加載機每個圖書館。

    • 優勢
      1. 很容易實現。
      2. 保持在庫庫自動加載語義。
      3. 更好維護的代碼由於責任
    • 缺點
      1. 在引導文件很多硬編碼類(不是什麼大不了的,雖然)
      2. 性能,因爲一個自動裝載的類必須去的分離通過多個自動加載機
      3. 泄漏的抽象層次,因爲一個圖書館可能需要付出更多的努力不僅僅是一個自動加載到引導
  3. 實現用於每個文庫(優選由庫提供)

    • 優點
      1. 實現非常簡單一bootstrap.php中。
      2. 更好的代碼保持庫的自動加載語義在庫由於分離關注
      3. 能夠定義非平凡庫自舉代碼而不混濁應用
    • 缺點的其它部分
      1. 仍然需要require_once '/path/to/lib/dir/bootstrap.php';初始化
      2. 性能(出於同樣的原因作爲第二溶液)
      3. 大多數第三方開發庫沒有實現引導文件,所以您可能需要維持一個。

就個人而言,我用的是第三個選項。我的CryptLib庫中的一個例子是bootstrap.php file。要初始化它,只需調用bootstrap。你也可以使用任何PSR-0自動加載器,而不是調用bootstrap.php,它會工作得很好。但是通過bootstrap選項,如果我添加了需要在啓動時註冊的功能,我可以將它添加到bootstrap.php文件中,它會自動執行(而不是告訴用戶他們需要執行「x,y ,z「在啓動時)...

對於您提到的通用類加載器選項(調用spl_autoload_register()而沒有參數),我個人不喜歡該選項。首先,它降低了類名(這違反了PSR-0,我不喜歡它,我已經習慣了區分大小寫的類 - >路徑映射,現在實際上更喜歡這種方式)。其次,它總是使用相對路徑,所以它會擊敗大多數操作碼緩存。還有其他的問題,但這些都是大的...

-1

後在該網頁上,你whant使添加到類的構造函數

public function __construct(){ 
$this->Register(); 
} 

負載創建一個對象

$obj = new PHPParser_Autoloader(); 
+0

我不確定這是如何幫助解決依賴性問題的。你能詳細說明一下嗎? – NikiC

+0

靜態類中的構造函數? –

2

如果類由PSR-0的命名慣例,較有可能的庫爲所有庫使用一個自動加載器。否則,庫應該提供自己的自動加載器。

+0

同意。 @NikiC只需看看通用自動加載器的一個不錯的[示例](https://github.com/symfony/symfony-standard/blob/master/app/autoload.php)(參見'$ loader-> registerPrefixes' )來自symfony,因爲你的PHPParser是symfony2的一部分。 – atma