ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer 自動載入

AutumnWind發表於2019-09-05

原始碼分析 (Loader.php)

  1. 先獲取到定義好的所有類 get_declared_classes()
  2. 拿到 Composer 安裝的類資訊
  3. ../vendor/composer/autoload_static.php 內資訊放入變數內
  4. 打完收工,這裡有疑問沒關係,先接著看
        /** 存在 ../vendor/composer/ Composer目錄則載入 */
        if (is_dir(self::$composerPath)) {
            if (is_file(self::$composerPath . 'autoload_static.php')) {
                /** 載入 ../vendor/composer/autoload_static.php  */
                require self::$composerPath . 'autoload_static.php';
                /** 返回所有已經定義的類  */
                $declaredClass = get_declared_classes();
                /** 獲取到最後一個類  */
                $composerClass = array_pop($declaredClass);
                /** 檢視 Composer 已經安裝的包  */
                foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {
                    /** 將一些設定好的資料放入到變數內  */
                    if (property_exists($composerClass, $attr)) {
                        self::${$attr} = $composerClass::${$attr};
                    }
                }
            } else {
                self::registerComposerLoader(self::$composerPath);
            }
        }

原始碼分析 (autoload_static.php)

  1. 大家可以看到,在上面定義好的陣列裡面就存在這兩個內容 prefixLengthsPsr4, prefixDirsPsr4,files
  2. Composer 的載入是在 autoload_static.php 取到的對映關係
  3. 以下是未安裝任何包的原始碼

    public static $prefixLengthsPsr4 = array (
        't' => 
        array (
            'think\\composer\\' => 15,
        ),
        'a' => 
        array (
            'app\\' => 4,
        ),
    );
    
    public static $prefixDirsPsr4 = array (
        'think\\composer\\' => 
        array (
            0 => __DIR__ . '/..' . '/topthink/think-installer/src',
        ),
        'app\\' => 
        array (
            0 => __DIR__ . '/../..' . '/application',
        ),
    );
  4. 這個時候我使用 Composer 安裝上 topthinkthink-helper,內部的對映關係就會變成以下這樣
    安裝命令
    $ composer require topthink/think-helper

    ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer自動載入支援

  5. 首先是多了一個 files 值,這個是安裝包的路徑
  6. prefixLengthsPsr4t多了一個 think\\=>6。這個的意思也挺簡單 think-helper 的名稱空間是 think,加上 \\就是6個字元(\\中夾帶轉義)
  7. prefixDirsPsr4 也一樣相對與上一個做出一個路徑對映
  8. 好了,原始碼就這樣很簡單。講的不算清楚還望見諒!!!

舉個栗子

  • 一般在多人專案當中,我們一般會將 vendor 內的檔案設定忽略。但是因為種種原因有很多人會出現有包檔案但沒有修改 autoload_static.php。或者舉例一個場景:比如 A 需要用到一個外掛,使用 Composer 下載好了之後。這個時候同事 B 偷懶直接將其外掛檔案複製過來。但是不管什麼操作就是報錯。那如何將一個複製的包載入到自動載入內呢
    1. 比如這個時候我存在一個 think-test 外掛,名稱空間是 think\test
      ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer自動載入支援
    2. 修改 autoload_static.php
      ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer自動載入支援
    3. 這樣即可直接使用
      ThinkPHP5.1.x 框架原始碼分析 (三) [框架的靈魂] - Composer自動載入支援

相關文章