Laravel 中 類的自動加載器 流程

// 引入自動加載器
require __DIR__.'/../bootstrap/autoload.php';

// 聲明啟動時間常量
define('LARAVEL_START', microtime(true));

// 引入自動加載器
require __DIR__.'/../vendor/autoload.php';
require_once __DIR__ . '/composer/autoload_real.php';

// 返回類的加載器
return ComposerAutoloaderInit9113d3930353009330b3153b2902b9cb::getLoader();

// 訪問getLoader靜態(tài)方法

// 判斷是否已存在加載器,如存在則自動返回
if (null !== self::$loader) {
    return self::$loader;
}

// 注冊類的自動加載器
// 第一個參數(shù)是callable,指明類和方法
// 第二個參數(shù)是說如果參數(shù)1出問題了是否拋出異常,默認 true
// 第三個參數(shù)是說是否將該函數(shù)加入列隊之首,默認 false
// 因為該函數(shù)可以多次使用,那么當類找不到引入時來調用該函數(shù)注冊的方法
// 到時候哪個方法誰對這次意外進行處理呢,所以有了參數(shù)三
spl_autoload_register(array('ComposerAutoloaderInit9113d3930353009330b3153b2902b9cb', 'loadClassLoader'), true, true);

// loadClassLoader 函數(shù)
// 該函數(shù)的 $class 參數(shù) 是當前未經(jīng) include 或 require 的類名
public static function loadClassLoader($class){
    if ('Composer\Autoload\ClassLoader' === $class) {
        require __DIR__ . '/ClassLoader.php';
    }
}

// 實例化加載器
// 實例化\Composer\Autoload\ClassLoader對象,并將結果保存到靜態(tài)變量 $loader 和 局部變量 $loader
self::$loader = $loader = new \Composer\Autoload\ClassLoader();

// 由于\Composer\Autoload\ClassLoader未經(jīng)引用
// 所以會調用loadClassLoader,并引入當前文件夾下的ClassLoader.php 文件

// 注銷剛剛注冊的加載器
spl_autoload_unregister(array('ComposerAutoloaderInit9113d3930353009330b3153b2902b9cb', 'loadClassLoader'));

// PHP_VERSION_ID:獲取當前PHP的版本ID
// 當輸入 php -v時顯示PHP 7.1.6,PHP_VERSION_ID 等于 70106
// 是否定義常量HHVM_VERSION 和 zend 相關函數(shù)
// 得到結果來判斷是否使用靜態(tài)加載器
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());

// 當 $useStaticLoader 為 真時,選擇靜態(tài)加載器。
// 我當前環(huán)境是Win10、PHP7.1.6 nts、apache2.4
// 結果 $useStaticLoader 為 true
// 引入靜態(tài)加載器
require_once __DIR__ . '/autoload_static.php';
// 加載靜態(tài)加載器中的資源
// 靜態(tài)加載器中包含了多個鍵值數(shù)組,如類庫映射表
// 其getInitializer函數(shù)接受一個ClassLoader
// 也就是上面已經(jīng)實例化的$loader對象
// 在函數(shù)中返回一個匿名函數(shù),函數(shù)中將靜態(tài)加載器中聲明的數(shù)組賦值給 $loader 對象
call_user_func(\Composer\Autoload\ComposerStaticInit9113d3930353009330b3153b2902b9cb::getInitializer($loader));

// 正式注冊加載器
$loader->register(true);

// register()函數(shù)在 ClassLoader.php 文件中
// 該函數(shù)執(zhí)行 類的加載器 注冊行為
// 并將該行為綁定到當前類的 loadClass 方法
// 同時將該注冊器的順序放到列隊的首位
public function register($prepend = false)
{
    spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}

// loadClass 方法中 調用 當前類的 findFile 方法來查找文件
// findFile 方法中 調用了 findFileWithExtension 函數(shù)
// 該函數(shù)有對根據(jù)類名和后綴查找文件路徑的具體實現(xiàn)
// 存在則引入并返回 true,反之則不管
public function loadClass($class)
{
    if ($file = $this->findFile($class)) {
        includeFile($file);

        return true;
    }
}

// 回到 ComposerAutoloaderInit9113d3930353009330b3153b2902b9cb 類
// 注冊好 類的自動加載器 后
// 判斷如果是靜態(tài)加載方式,那么獲取靜態(tài)加載類中的 `$file` 數(shù)組
public static $files = array (
    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
    '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
    '1d1b89d124cc9cb8219922c9d5569199' => __DIR__ . '/..' . '/hamcrest/hamcrest-php/hamcrest/Hamcrest.php',
    '2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
    '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
    'e7223560d890eab89cda23685e711e2c' => __DIR__ . '/..' . '/psy/psysh/src/Psy/functions.php',
    'f0906e6318348a765ffb6eb24e0d0938' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Foundation/helpers.php',
    '58571171fd5812e6e447dce228f52f4d' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Support/helpers.php',
);

// 然后通過foreach循環(huán)遍歷,require 引入,并 根據(jù) key 標記該文件已經(jīng)引入了

// 最終,返回該 $loader
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容