1. 程式人生 > 實用技巧 >composer分析(二)結合PSR-4

composer分析(二)結合PSR-4

composer分析(二)結合PSR-4


  • PSR-4提供了一種檔案和路徑對映關係,非常類似檔案系統的組織結構

  • 全限定類名

    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    規定了類必須有一個頂級名稱空間,可以有多個子名稱空間。
    頂級名稱空間和目錄對應的關係相對特殊,可在autoload_psr4.php中檢視
    對映關係是一個數組,是因為composer支援從多個目錄下載入同一個名稱空間字首
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    return array(
        'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
        'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'),
        'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
    	...
        'App\\' => array($baseDir . '/App'),
    );
    
    子名稱空間分別對應頂級路徑下的資料夾,如 App\Logic\HttpController\TestController對應路徑是"{$baseDir} /App/Logic/HttpController"下的TestController.php
        
    同時PSR-4要求檔名必須和類名保持完全一致,上述的TestController.php檔名由TesctController這個類名決定。
    
  • 對映規則

    vendor/
        vendor_name/
            package_name/
                src/
                    ClassName.php       # Vendor_Name\Package_Name\ClassName
                tests/
                    ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
    
  • composer資料夾下的檔案

    autoload_classmap.php  // 儲存類檔案和真實路徑對映
    autoload_files.php     // 儲存全域性函式檔案和路徑對映
    autoload_psr4.php      // 儲存頂級名稱空間和路徑對映
    autoload_static.php    // 儲存composer載入器解析過程中需要用到的對映關係陣列
    ClassLoader.php 
        此檔案中的findFile方法會先查詢classmap中是否存在需要載入類的對映,如果不存在會先根據上文描述的PSR-4規則拼接檔案的真實路徑,沒找到還會走PSR-0規則。最後然會檔案的絕對路徑include完成檔案的載入。可以看到如果存在類路徑對映會非常快的實現類的自動載入,就不需要檔案系統的檢查了。
        如何生成類對映關係: 執行命令 composer dump-autoload (-o),生產環境建議執行,因為從classmap中直接返回對映關係,便不需要再去動態讀取PSR載入規範了,可減少檔案系統的操作,提升部分效能
    
  • 有興趣的可以列印composer返回的自動載入器物件,允許我們在引入autoload.php檔案後動態新增各種的對映關係


下集預告:composer的基本命令