Tp6源码分析之基础类库加载过程:(流程一)

tp6自身、composer以及已下载的(已经拥有的)基础类库自动加载(简而言之就是将当前项目所安装的基础类库写入内存,方便项目编写过程中调用)

一、入口文件:public/index.php

本节将围绕 require DIR . ‘/…/vendor/autoload.php’; 基础类库自动加载过程的讲述

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2019 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// [ 应用入口文件 ]
namespace think;

require __DIR__ . '/../vendor/autoload.php';  // 引入注册:当前项目所有基础类库(也就是全部写入内存方便调用)

// 执行HTTP应用并响应
$http = (new App())->http;
$response = $http->run();

$response->send();

$http->end($response);

二、vendor/autoload.php

if (PHP_VERSION_ID < 50600) { // 判断当前项目环境中php版本是否低于5.06,否则项目将不能执行
    if (!headers_sent()) {
        header('HTTP/1.1 500 Internal Server Error');
    }
    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
    if (!ini_get('display_errors')) {
        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
            fwrite(STDERR, $err);
        } elseif (!headers_sent()) {
            echo $err;
        }
    }
    trigger_error(
        $err,
        E_USER_ERROR
    );
}

require_once __DIR__ . '/composer/autoload_real.php'; // 引入autoload_real.php

// 执行autoload_real.php类中的getLoader();
return ComposerAutoloaderInit10ee1093f11867f1c9f57137d5840abf::getLoader(); 

三、composer/autoload_real.php


 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;
        }
        // var_dump(__DIR__ . '/platform_check.php');die;
        require __DIR__ . '/platform_check.php'; // 验证php运行环境是否大于8.0,否则将抛出异常
        // 注册当前类库中的loadClassLoader方法,该方法引入composer 依赖 ClassLoader类库
        spl_autoload_register(array('ComposerAutoloaderInit10ee1093f11867f1c9f57137d5840abf', 'loadClassLoader'), true, true);
      //  声明ClassLoader类库 并引入(ClassLoader类库 存放PSR-4规范依赖库映射关系的属性为自己的成员属性)赋值给$loader
        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
        //var_dump($loader);die;

        // 取得属性值后,取消loaderClassLoader方法注册
        spl_autoload_unregister(array('ComposerAutoloaderInit10ee1093f11867f1c9f57137d5840abf', 'loadClassLoader'));
        // var_dump($loader);die; // 返回

        // 引入autoload_static类库,该类库存放当前所有依赖库的PSR-4规范的类库文件地址映射关系
        require __DIR__ . '/autoload_static.php'; // 如果需要自定义依赖库或者extend文件下添加依赖库,则需要到该文件中按照PSR-4规范添加库的地址映射信息

        // call_user_func调用composer中 autoload_static.php类库中的getInitializer()方法,$loader变量为参数;
        // 返回$loader对象并且将thinkphp中依赖类库地址映射复制给$loader对应的属性值
        call_user_func(\Composer\Autoload\ComposerStaticInit10ee1093f11867f1c9f57137d5840abf::getInitializer($loader));
        //var_dump($loader);die; // 返回

        // 注册$loader对象中已存在地址映射的基础类库
        $loader->register(true);
        // var_dump($loader);die; // 返回

        // 将框架基础类库的地址数组赋值给$filesToLoad
        $filesToLoad = \Composer\Autoload\ComposerStaticInit10ee1093f11867f1c9f57137d5840abf::$files;
        //var_dump($filesToLoad);die;

        // Todo: 创建$requireFile对象的意义在哪里,知道的大佬可以给指点指点
        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
                $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
                // var_dump($file);die;

                require $file;
            }
        }, null, null);
		// Todo:意义何在?
        foreach ($filesToLoad as $fileIdentifier => $file) {
            $requireFile($fileIdentifier, $file);
        }

            // 返回对象包含了当前项目内所有基础类库的文件地址映射关系
        // var_dump($loader);die;
        return $loader;
    }

四、最后获取到$loader对象数据如下(该映射地址没有额外安装任何依赖库):

D:\wamp64\www\studentTp6SourceCode\vendor\composer\autoload_real.php:68:
object(Composer\Autoload\ClassLoader)[1]
  private 'vendorDir' => string 'D:\wamp64\www\studentTp6SourceCode\vendor' (length=41)
  private 'prefixLengthsPsr4' => 
    array (size=5)
      't' => 
        array (size=2)
          'think\trace\' => int 12
          'think\' => int 6
      'a' => 
        array (size=1)
          'app\' => int 4
      'S' => 
        array (size=2)
          'Symfony\Polyfill\Mbstring\' => int 26
          'Symfony\Component\VarDumper\' => int 28
      'P' => 
        array (size=4)
          'Psr\SimpleCache\' => int 16
          'Psr\Log\' => int 8
          'Psr\Http\Message\' => int 17
          'Psr\Container\' => int 14
      'L' => 
        array (size=2)
          'League\MimeTypeDetection\' => int 25
          'League\Flysystem\' => int 17
  private 'prefixDirsPsr4' => 
    array (size=11)
      'think\trace\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../topthink/think-trace/src' (length=78)
      'think\' => 
        array (size=4)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../topthink/think-helper/src' (length=79)
          1 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../topthink/think-orm/src' (length=76)
          2 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../topthink/framework/src/think' (length=82)
          3 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../topthink/think-filesystem/src' (length=83)
      'app\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../../app' (length=60)
      'Symfony\Polyfill\Mbstring\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../symfony/polyfill-mbstring' (length=79)
      'Symfony\Component\VarDumper\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../symfony/var-dumper' (length=72)
      'Psr\SimpleCache\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../psr/simple-cache/src' (length=74)
      'Psr\Log\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../psr/log/src' (length=65)
      'Psr\Http\Message\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../psr/http-message/src' (length=74)
      'Psr\Container\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../psr/container/src' (length=71)
      'League\MimeTypeDetection\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../league/mime-type-detection/src' (length=84)
      'League\Flysystem\' => 
        array (size=1)
          0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../league/flysystem/src' (length=74)
  private 'fallbackDirsPsr4' => 
    array (size=0)
      empty
  private 'prefixesPsr0' => 
    array (size=0)
      empty
  private 'fallbackDirsPsr0' => 
    array (size=1)
      0 => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../../extend' (length=63)
  private 'useIncludePath' => boolean false
  private 'classMap' => 
    array (size=1)
      'Composer\InstalledVersions' => string 'D:\wamp64\www\studentTp6SourceCode\vendor\composer/../composer/InstalledVersions.php' (length=84)
  private 'classMapAuthoritative' => boolean false
  private 'missingClasses' => 
    array (size=0)
      empty
  private 'apcuPrefix' => null

欢迎磨刀石骚扰!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值