0

0

PHP框架设计之ThinkPHP5源码解析一

黄舟

黄舟

发布时间:2017-02-08 09:27:19

|

5337人浏览过

|

来源于php中文网

原创

thinkphp是一个快速、兼容而且简单的轻量级国产php开发框架,也是国内使用最为广泛的国产框架。诞生于2006年,历经fcs0.6.0到 thinkphp 0.9.5,历经1.0到3.0的发展。2015年发布thinkphp5.0版本。采用全新的架构思想,引入了更多的php新特性,优化了核心,减少了依赖,实现了真正的惰性加载,支持composer,并针对api开发做了大量的优化,包括路由、日志、异常、模型、数据库、模板引擎和验证等模块都已经重构。兼容php最新版本。这使得他成为框架的首选。下面也就其框架对一定的解析。

运行机制及流程

990.jpg

1.入口文件index.php

独立模式

立即学习PHP免费学习笔记(深入)”;

define('APP_PATH', __DIR__ . '/../application/');
define('APP_DEBUG', true);require __DIR__ . '/../thinkphp/start.php';

composer模式

define('APP_PATH', __DIR__ . '/../application/');

define('APP_DEBUG', true);if (is_file(__DIR__ . '/../vendor/autoload.php')) {    require_once __DIR__ . '/../vendor/autoload.php';
} else {    require __DIR__ . '/../thinkphp/start.php';
}

2.框架引导文件start.php

namespace think;

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

3.全局变量文件base.php

define('THINK_VERSION', '5.0.2'); 
//TP版本号define('THINK_START_TIME', microtime(true));
//启动时间define('THINK_START_MEM', memory_get_usage());
//获取分配给 PHP 的内存量define('EXT', '.php'); 
//文件后缀define('DS', DIRECTORY_SEPARATOR);
//系统分隔符defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
//项目根目录define('LIB_PATH', THINK_PATH . 'library' . DS);
//类库目录define('CORE_PATH', LIB_PATH . 'think' . DS);
//核心文件目录define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
//复用机制文件目录defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
//应用根目录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_PATH', ROOT_PATH . 'vendor' . DS);
//第三方库和插件放置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('CACHE_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);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);

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

// 加载环境变量配置文件
if (is_file(ROOT_PATH . '.env')) {
 $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");
 }
 }
}

// 注册自动加载
	hinkLoader::register();

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

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

4.自动加载器文件Loader.php

Loader.php是框架的类的自动加载实现文件。可以使用autoload()自动挡加载类,import()手动加载指定目录的类。
protected static $map = []; 系统的类名映射缓存数组,在下面的addMap()使用
protected static $load = []; 系统的加载列表缓存数组,在下面的autoload()使用
protected static $namespace = []; 系统的命名空间缓存数组,在下面的addNamespace()使用

private static $prefixLengthsPsr4 = [];private static $prefixDirsPsr4    = [];

系统的PSR-4缓存数组,在下面的registerComposerLoader()使用
private static $prefixesPsr0 = []; 系统的PSR-0缓存数组,在下面的registerComposerLoader()使用。

上面四个静态变量用作加载器的缓存数组,保证加载效率。

DESTOON B2B网站管理系统
DESTOON B2B网站管理系统

DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。

下载

1 autoload($class)
根据类名自动加载。

public static function autoload($class){}

使用类库映射加载对应的类。

if (isset(self::$map[$class])) {    if (is_file(self::$map[$class])) {
        APP_DEBUG && self::$load[] = self::$map[$class];        include self::$map[$class];
    }
}

使用composer加载类

elseif ($file = self::findFileInComposer($class)) {
    APP_DEBUG && self::$load[] = $file;    include $file;
}

根据命名空间自动加载类

else {    if (!strpos($class, '\')) {        return;
    }    list($name, $class) = explode('\', $class, 2);    
    if (isset(self::$namespace[$name])) {        $path = self::$namespace[$name];
    } elseif (is_dir(EXTEND_PATH . $name)) {        $path = EXTEND_PATH . $name . DS;
    } else {        return;
    }    $filename = $path . str_replace('\', DS, $class) . EXT;    
    if (is_file($filename)) {        if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . EXT)) {            return;
        }

        APP_DEBUG && self::$load[] = $filename;        include $filename;
    } else {
        Log::record('autoloader error : ' . $filename, 'notice');
    }
}

2 addMap($class,$map='')
注册类名映射
public static function addMap($class, $map = ''){} 数组合并到$map,字符串关联到$class.

if (is_array($class)) {    self::$map = array_merge(self::$map, $class);
} else {    self::$map[$class] = $map;
}

3 addNamespace($namespace,$path)
注册命名空间和路径的关联
public static function addNamespace($namespace, $path = ''){} 数组合并到$namespace,字符串关联到path.

if (is_array($namespace)) {    self::$namespace = array_merge(self::$namespace, $namespace);
} else {    self::$namespace[$namespace] = $path;
}

4 register($autoload='')
注册自动加载机制
public static function register($autoload = ''){} thinkLoader::autoload()系统自动加载
self::registerComposerLoader() composer自动加载

spl_autoload_register($autoload ? $autoload : 'think\Loader::autoload');self::registerComposerLoader();

5 composer自动加载的注册
private static function registerComposerLoader(){} 关于composer自动加载机制见 基础原理的php的composer自动加载

6 composer自动加载的两个私有方法

private static function composerRequire($fileIdentifier, $file){}private static function findFileInComposer($class, $ext = '.php'){}

7 import($class,$baseUrl='',$ext=EXT)
手动加载$baseUrl下的$class命名的$ext后缀文件
public static function import($class, $baseUrl = '', $ext = EXT){} 首先分析$baseUrl,
然后查找$baserUrl.$class.$ext 文件名,然后加载对应文件

以上就是PHP框架设计之ThinkPHP5源码解析一的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

0

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

1

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

3

2026.02.24

Golang 疑难杂症解决指南:常见问题排查与优化
Golang 疑难杂症解决指南:常见问题排查与优化

《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。

0

2026.02.24

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

0

2026.02.24

中国研究生招生信息网官方网站入口 研招网网页版在线入口
中国研究生招生信息网官方网站入口 研招网网页版在线入口

中国研究生招生信息网入口(https://yz.chsi.com.cn) 此网站是研究生报名入口的唯一官方网站

75

2026.02.24

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

14

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

15

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号