thinkPHP5.0框架自动加载机制分析


Posted in PHP onMarch 18, 2017

本文实例讲述了thinkPHP5.0框架自动加载机制。分享给大家供大家参考,具体如下:

概述

ThinkPHP5.0 真正实现了按需加载,所有类库采用自动加载机制,并且支持类库映射和composer类库的自动加载。

自动加载的实现由think\Loader类库完成,自动加载规范符合PHP的PSR-4。

自动加载

由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。

类库的自动加载检测顺序如下:

1、类库映射检测;
2、PSR-4自动加载检测;
3、PSR-0自动加载检测;

系统会按顺序检测,一旦检测生效的话,就会自动载入对应的类库文件。

类库映射

遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射。命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:

Loader::addClassMap('think\Log',LIB_PATH.'think\Log.php');
Loader::addClassMap('org\util\Array',LIB_PATH.'org\util\Array.php');

也可以利用addClassMap方法批量导入类库映射定义,例如:

$map = [
  'think\Log'   => LIB_PATH.'think\Log.php',
  'org\util\array'=> LIB_PATH.'org\util\Array.php'
];
Loader::addClassMap($map);

虽然通过类库映射的方式注册的类可以不强制要求对应命名空间目录,但是仍然建议遵循PSR-4规范定义类库和目录。

类库导入

如果你不需要系统的自动加载功能,又或者没有使用命名空间的话,那么也可以使用think\Loader类的import方法手动加载类库文件,例如:

Loader::import('org.util.array');
Loader::import('@.util.upload');

示例

// 引入 extends/qrcode.php
Loader::import('qrcode', EXTEND_PATH);
// 助手函数
import('qrcode', EXTEND_PATH);
// 引入 extends/wechat-sdk/wechat.class.php
Loader::import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');
// 助手函数
import('wechat-sdk.wechat', EXTEND_PATH, '.class.php');

类库导入也采用类似命名空间的概念(但不需要实际的命名空间支持),支持的“根命名空间”包括:

目录 说明
behavior 系统行为类库
think 核心基类库
traits 系统Traits类库
app 应用类库
@ 表示当前模块类库包

如果完全遵从系统的命名空间定义的话,一般来说无需手动加载类库文件,直接实例化即可。

Composer自动加载

5.0版本支持Composer安装的类库的自动加载,你可以直接按照Composer依赖库中的命名空间直接调用。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP默认安装产生系统漏洞
Oct 09 PHP
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
php5编程中的异常处理详细方法介绍
Jul 29 PHP
PHP 中文处理技巧
Apr 25 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 #PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 #PHP
thinkPHP5.0框架API优化后的友好性分析
Mar 17 #PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 #PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 #PHP
PHP中类的自动加载的方法
Mar 17 #PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 #PHP
You might like
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
详解php中反射的应用
2016/03/15 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
Js切换功能的简单方法
2010/11/23 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
2016/12/08 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
详解js前端代码异常监控
2017/01/11 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
2019/08/26 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[44:10]2018DOTA2亚洲邀请赛 4.5 淘汰赛 EG vs VP 第一场
2018/04/06 DOTA
python的Template使用指南
2014/09/11 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python安装及变量名介绍详解
2020/12/12 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
用Python爬取某乎手机APP数据
2021/06/15 Python
排查Tomcat进程假死的问题
2022/05/06 Servers
Python中tqdm的使用和例子
2022/09/23 Python