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
欢迎磨刀石骚扰!!!