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;
}