thinkPHP5框架解读

本文将详细解读ThinkPHP5框架的启动流程,从入口文件开始,逐步剖析start.php、base.php的调用,以及Loader类和App.php在框架中的核心作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、入口文件

//public/index.php

//定义应用目录
define('APP_PATH',__DIR__.'/../application/');
//加载框架引导文件
require __dir__.'/../thinkphp/start.php';

调用thinkphp文件夹中的start.php

//thinkphp/start.php

namespace think;

//加载基础文件
require __DIR__.'/base.php';
//执行应用
App::run()->send();

调用thinkphp文件夹中的base.php

//thinkphp/base.php


//thinkphp版本
define('THINK_VERSION','5.0.16');

//thinkphp开始的时间
define('THINK_START_TIME',microtime(true));

//当前分配给你的 PHP 脚本的内存量,单位是字节(byte)
define('THINK_START_MEM',memory_get_useage());

//文件后缀
define('EXT','.php');

//定义文件分隔符 DIRECTORY_SEPARATOR = "/"
define('DS',DIRECTORY_SEPARATOR);

//判断think目录是否定义
defined('THINK_PATH') or define('THINK_PATH',__DIR__.DS);

//定义lib文件夹路径
define('LIB_PATH',THINK_PATH.'library'.DS);

//框架核心文件夹路径
define('CORE_PATH',LIB_PATH.'think'.DS);

//trait目录
define('TRAIT_PATH',LIB_PATH.'traits'.DS);

//判断应用目录是否定义 $_SERVER['SCRIPT_FILENAME']获取前脚本绝对路径 dirname()获取脚本所在的文件夹
defined('APP_PATH') or define('APP_PATH',dirname($_SERVER['SCRIPT_FILENAME']).DS);

//判断网站路径是否定义 realpath 函数返回绝对路径
defined('ROOT_PATH') or define('ROOT_PATH',dirname(realpath(APP_PATH)).DS);

//判断定义拓展文件夹路径
defined('EXTEND_PATH') or define('EXTEND_PATH',ROOT_PATH.'extend'.DS);

// 渲染文件夹目录
defined('VENDOR_PATH') or define('VENDOR',ROOT_PATH.'vendor'.DS);

//runtime
defined('RUNTIME_PATH') or define('RUNTIME_PATH',ROOT_PATH.'runtime'.DS);

//日志
defined('LOG_PATH') or define('LOG_PATH',RUNTIME_PATH.'log'.DS);

//缓存
defined('CACHE_PATH') or define('LOG_PATH',RUNTIME_PATH.'cache'.DS);

//模板
defined('TEMP_PATH') or define('TEMP_PATH',RUNTIME_PATH.'temp'.DS);

// 配置文件目录
defined('CONF_PATH') or define('CONF_PATH',APP_PATH);

// 配置文件后缀
defined('CONF_EXT') or define('CONF_EXT',EXT);

//环境变量的配置前缀
defined('ENV_PREFIX') or define('ENV_PREFIX','PHP_');

//环境常量
define('IS_CLI',PHP_SAPI=='cli'?true:false); web服务器
define('IS_WIN',strpos(PHP_OS,'WIN') !== false); //操作系统

//载入loader类
require CORE_PATH.'loader.php';

//载入环境变量配置文件
if(is_file(ROOT_PATH.'env')){
    //parse_ini_file() 载入一个由 filename指定的 ini 文件,并将其中的设置作为一个联合数组返回
    $env = parse_ini_file(ROOT_PATH.'.env',true); 
    foreach($env as $key=>$val){
        $name = ENV_PREFIX.strtoupper($key);

        if(is_array($val)){
            foreach($val as $k=>$v){
                $item = $name.'_'.strtoupper($k);
                putenv("$item=$v");
            }
        }else{
            putenv("$name=$val");
        }
    }
}

//注册自动加载
\think\Loader::register();

//注册错误和异常处理机制
\think\Error::register();

//加载惯例配置文件
\think\Config::set(include THINK_PATH.'convention'.EXT);

调用think文件夹下的Loader类

//lib/think

//自动加载
public static function autoload($class)
{
    ...
}

//查找文件
private static function findFile($class)
{
    ...
}

//注册classmap
public static function addClassMap($class, $map = '')
{
    ...
}

//注册命名空间
public static funtion addNamespace($namespace, $path = '')
{
    ...
}

//添加 PSR-4 空间
private static function addPsr4($prefix, $paths, $prepend = false)
{
    ...
}

// 注册命名空间别名
public static function addNamespaceAlias($namespace, $original = '')
{
    ...
}

//注册自动加载机制
public static function register($autoload = null)
{
    ...
}

//注册composer自动加载
private static function registerComposerLoader()
{
    ...
}

//导入所需类库同 Java 的 import 本函数有缓存功能
public static function import($class, $baseUrl = '', $ext = EXT)
{
    ...
}

//实例化 (分层)模型
public static function model($name = '', $layer = 'model', $appendSuffix = false, $common = 'common')
{
    ...
}

//实例化(分层)控制器格式
public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '')
{
    ...
}

//实例化验证类格式
public static function validate($name, $layer = 'validate', $appendSuffix = false, $common = 'common')
{
    ...
}

//解析模板和类名
protected static function getModuleAndClass($name, $layer, $appendSuffix)
{
    ...
}

//数据库初始化,并取得数据库类实例
public static function db($config = [], $name = false)
{
    ...
}

//字符串命名风格转换
public static function parseName($name, $type = 0, $ucfirst = true)
{
    ...
}

// 解析应用类的类名
public static function parseClass($module, $layer, $name, $appendSuffix)
{
    ...
}

//初始化类的实例
public static function clearInstance()
{
    ...
}

//作用范围隔离
function __include_fime($file)
{
    ...
}
function __require_file($file)
{
    ...
}

调用think文件夹下的App.php

//library/think

class APP
{
    // 执行应用程序
    public static function run(Request $request = null)
    {
        ...
    }

    // 初始化应用,并返回配置信息
    public static function initCommon()
    {
        ...
    }

    //初始化应用或模块
    private static function init($module = '')
    {
        ...
    }
    
    //设置当前请求的调度信息
    public static function dispatch($dispatch, $type = 'module')
    {
        ...
    }

    //执行函数或闭包方法 支持参数调用
    public static function invokeFunction($function, $vars = [])
    {
        ...
    }

    //调用反射执行类的方法 支持参数绑定
    public static function invokeMethod($mothed, $vars = [])
    {
        ...
    }

    //调用反射执行类的实例化 支持依赖注入
    public static function invokeClass($class, $vars = [])
    {
        ...
    }

    // 绑定参数
    private static function bindParams($reflect, $vars = [])
    {
        ...
    }
    
    // 获取参数值
    private static function getParamvalue($param, &$vars, $type)
    {
        ...
    }

    // 执行调度分发
    protected static function exec($dispatch, $config)
    {
        ...
    }

    //执行模块
    public static function module($result, $config, $convert = null)
    {
        ...
    }

    //URL 路由检查
    public static function routeCheck($request, array $config)
    {
        ...
    }
    
    //设置应用的路由检测机制
    public static function route($route, $must = false)
    {
        ...
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值