探究Laravel4.2加載(一)— autoload

以手上的4.2爲準,本篇只看自動加載部分。php

入口文件在:/public/index.php,打開看看。html

<?php
require __DIR__.'/../bootstrap/autoload.php';

來到 /bootstrap/autoload.phplaravel

<?php
// 記錄Laravel開始加載的時間
define('LARAVEL_START', microtime(true));

// 下一步看看這個文件
require __DIR__.'/../vendor/autoload.php';

來到 /vendor/autoload.phpbootstrap

<?php
// 下一步看看這個文件
require_once __DIR__ . '/composer' . '/autoload_real.php';
// 預告:require了上面這個文件以後,執行了上面文件中的getLoader()方法,類名是動態生成的
return ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50::getLoader();

終於來到 /vender/composer/autoload_real.phpcomposer

<?php
// 動態生成的類名
class ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50
{
    private static $loader;

    public static function loadClassLoader($class)
    {
        // 臨時的加載函數,只容許加載Composer\Autoload\ClassLoader
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
        // 註冊本身的自動加載函數,就在上面。
        // 第三個參數是true,將本身的自動加載函數註冊到隊列之首。
        spl_autoload_register(array('ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50', 'loadClassLoader'), true, true);
        // 藉助自動加載函數 加載ClassLoader到$loader
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        // 把剛剛註冊的自動加載函數註銷掉。是的,就是這麼任性,臨時用了一下
        spl_autoload_unregister(array('ComposerAutoloaderInit78fadea5a0911ad1d52c374950318f50', 'loadClassLoader'));

        // 設置 include_path
        $includePaths = require __DIR__ . '/include_paths.php';
        array_push($includePaths, get_include_path());
        set_include_path(join(PATH_SEPARATOR, $includePaths));

        // 登記以PSR-0方式加載的類們
        $map = require __DIR__ . '/autoload_namespaces.php';
        foreach ($map as $namespace => $path) {
            $loader->set($namespace, $path);
        }

        // 登記以PSR-4方式加載的類們
        $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);
        }
        
        // 執行加載
        $loader->register(true);

        // 加載一些文件,這些文件的目的是註冊一些函數
        $includeFiles = require __DIR__ . '/autoload_files.php';
        foreach ($includeFiles as $fileIdentifier => $file) {
            // 借用下面的方法去加載
            composerRequire78fadea5a0911ad1d52c374950318f50($fileIdentifier, $file);
        }

        // 到此自動加載結束,層層跳回
        return $loader;
    }
}

function composerRequire78fadea5a0911ad1d52c374950318f50($fileIdentifier, $file)
{
    // 若是加載過了就不重複加載
    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
        require $file;
    
        // 加載過以後給個標記
        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
    }
}

博客:http://blog.lovemydeer.com/2016/03/22/laravel4dot2-autoload.html函數

相關文章
相關標籤/搜索