ThinkPHP6源码研读

Posted 禅_无知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP6源码研读相关的知识,希望对你有一定的参考价值。

<?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

autoload文件如下

<?php

// autoload.php @generated by Composer

require_once __DIR__ . \'/composer/autoload_real.php\';

return ComposerAutoloaderInitb4bb23f5554b6a38d22fe61fc7fad9b3::getLoader();

由此可见,要引入autoload_real.php,然后执行 

 ComposerAutoloaderInitb4bb23f5554b6a38d22fe61fc7fad9b3类下的getLoader方法
    /**
     * @return \\Composer\\Autoload\\ClassLoader
     */
    public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }
       
        require __DIR__ . \'/platform_check.php\';

        spl_autoload_register(array(\'ComposerAutoloaderInitb4bb23f5554b6a38d22fe61fc7fad9b3\', \'loadClassLoader\'), true, true);
        self::$loader = $loader = new \\Composer\\Autoload\\ClassLoader();
        spl_autoload_unregister(array(\'ComposerAutoloaderInitb4bb23f5554b6a38d22fe61fc7fad9b3\', \'loadClassLoader\'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined(\'HHVM_VERSION\') && (!function_exists(\'zend_loader_file_encoded\') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require __DIR__ . \'/autoload_static.php\';

            call_user_func(\\Composer\\Autoload\\ComposerStaticInitb4bb23f5554b6a38d22fe61fc7fad9b3::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);
            }
        }

        $loader->register(true);

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

        return $loader;
    }

在getLoader方法 首先判断存在不存在$loader静态属性,如果不存在,则去引入当前目录下的(项目根目录/vendor/composer)platform_check.php 文件
platform_check.php主要是为了检测当前运行PHP的版本。

<?php

// platform_check.php @generated by Composer

$issues = array();
 
if (!(PHP_VERSION_ID >= 70205)) {
    $issues[] = \'Your Composer dependencies require a PHP version ">= 7.2.5". You are running \' . PHP_VERSION . \'.\';
}

if ($issues) {
    if (!headers_sent()) {
        header(\'HTTP/1.1 500 Internal Server Error\');
    }
    if (!ini_get(\'display_errors\')) {
        if (PHP_SAPI === \'cli\' || PHP_SAPI === \'phpdbg\') {
            fwrite(STDERR, \'Composer detected issues in your platform:\' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
        } elseif (!headers_sent()) {
            echo \'Composer detected issues in your platform:\' . PHP_EOL.PHP_EOL . str_replace(\'You are running \'.PHP_VERSION.\'.\', \'\', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
        }
    }
    trigger_error(
        \'Composer detected issues in your platform: \' . implode(\' \', $issues),
        E_USER_ERROR
    );
}

如果检测通过,则去执行spl_autoload_register()自动加载函数

 

以上是关于ThinkPHP6源码研读的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo源码研读记

ThinkPhp6.x+Vue+AntDesign低代码后台管理系统源码

ThinkPHP6源码分析之应用初始化

spring事务源码研读1

ThinkPHP6.0在phpstorm添加查询构造器和模型的代码提示

Spark源码研读-散篇记录:SparkConf