Laravel框架 自动加载分析

265 阅读1分钟

laravel 框架, index.php 文件代码分析

index.php 的部分代码

版本5.8

use Illuminate\Foundation\Http\Kernel;

define('LARAVEL_START', microtime(true)); # 第一常量 LARAVEL_START


require __DIR__.'/../vendor/autoload.php'; // __DIR__ 函数返回当前文件所在文件路径

require DIR.'/../vendor/autoload.php' 分析

autoload.php


# `require_once` 语句和 [require](https://www.php.net/manual/zh/function.require.php) 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
require_once __DIR__ . '/composer/autoload_real.php';  

return ComposerAutoloaderInitdfa4653e177b9db7c9afe9170d01dccf::getLoader();

ComposerAutoloaderInitdfa4653e177b9db7c9afe9170d01dccf::getLoader(); 分析


public static function loadClassLoader($class)
{
    if ('Composer\Autoload\ClassLoader' === $class) {
        require __DIR__ . '/ClassLoader.php';
    }
}

public static function getLoader() 
{
    if (null !== self::$loader) {
        return self::$loader;
    }

    // spl_auload_register 函数 spl_autoload_register — 注册给定的函数作为 __autoload 的实现
    spl_autoload_register(array('ComposerAutoloaderInitdfa4653e177b9db7c9afe9170d01dccf', 'loadClassLoader'), true, true);
    
    // new 一个对象的时候会触发 ComposerAutoloaderInitdfa4653e177b9db7c9afe9170d01dccf 中的 
    // loanClassLoader 函数 ,loaderClassLoader函数的作用是 require. ClassLoader 文件
    self::$loader = $loader = new \Composer\Autoload\ClassLoader();
    // 注销已注册的 __autoload() 函数
    spl_autoload_unregister(array('ComposerAutoloaderInitdfa4653e177b9db7c9afe9170d01dccf', 'loadClassLoader'));

    // 判断 PHP 版本是否大于 5.6 然后是否定义了 HHVM_VERSION 常量 和 是否存在 zend_loader_file_encoded 函数。
    $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
    if ($useStaticLoader) {
           // 条件判断进入这里
       require_once __DIR__ . '/autoload_static.php';
// call_user_func call_user_func — 把第一个参数作为回调函数调用
             call_user_func(\Composer\Autoload\ComposerStaticInitdfa4653e177b9db7c9afe9170d01dccf::getInitializer($loader));
    } else {
        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        $map = require __DIR__ . '/autoload_psr4.php';
        foreach ($map as $namespace => $path) {
            $loader->setPsr4($namespace, $path);
        }

        $classMap = require __DIR__ . '/autoload_classmap.php';
        if ($classMap) {
            $loader->addClassMap($classMap);
        }
    }
    
    // 重新注册 auload 类,如果是实例话类的时候 调用 loadClass方法
    $loader->register(true);

    if ($useStaticLoader) {
        $includeFiles = Composer\Autoload\ComposerStaticInitdfa4653e177b9db7c9afe9170d01dccf::$files;
    } else {
        $includeFiles = require __DIR__ . '/autoload_files.php';
    }
    foreach ($includeFiles as $fileIdentifier => $file) {
        composerRequiredfa4653e177b9db7c9afe9170d01dccf($fileIdentifier, $file);
    }

    //返回loader
    return $loader;
}