原始碼分析 (Loader.php)
- 先獲取到定義好的所有類
get_declared_classes()
- 拿到
Composer
安裝的類資訊 - 將
../vendor/composer/autoload_static.php
內資訊放入變數內 - 打完收工,這裡有疑問沒關係,先接著看
/** 存在 ../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)
- 大家可以看到,在上面定義好的陣列裡面就存在這兩個內容
prefixLengthsPsr4, prefixDirsPsr4,files
Composer
的載入是在autoload_static.php
取到的對映關係-
以下是未安裝任何包的原始碼
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', ), );
- 這個時候我使用
Composer
安裝上topthink
的think-helper
,內部的對映關係就會變成以下這樣安裝命令 $ composer require topthink/think-helper
- 首先是多了一個
files
值,這個是安裝包的路徑 prefixLengthsPsr4
中t
多了一個think\\=>6
。這個的意思也挺簡單think-helper
的名稱空間是think
,加上\\
就是6個字元(\\
中夾帶轉義)prefixDirsPsr4
也一樣相對與上一個做出一個路徑對映- 好了,原始碼就這樣很簡單。講的不算清楚還望見諒!!!
舉個栗子
- 一般在多人專案當中,我們一般會將
vendor
內的檔案設定忽略。但是因為種種原因有很多人會出現有包檔案但沒有修改autoload_static.php
。或者舉例一個場景:比如 A 需要用到一個外掛,使用Composer
下載好了之後。這個時候同事 B 偷懶直接將其外掛檔案複製過來。但是不管什麼操作就是報錯。那如何將一個複製的包載入到自動載入內呢- 比如這個時候我存在一個
think-test
外掛,名稱空間是think\test
- 修改
autoload_static.php
- 這樣即可直接使用
- 比如這個時候我存在一個