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 相关文章推荐
ASP和PHP都是可以删除自身的
Apr 09 PHP
php缓存技术详细总结
Aug 07 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
PHP defined()函数的使用图文详解
Jul 20 PHP
Laravel获取所有的数据库表及结构的方法
Oct 10 PHP
php5与php7的区别点总结
Oct 11 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
php xml实例 留言本
2009/03/20 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
2019/01/18 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
关于Python数据结构中字典的心得
2017/12/04 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
美国眼镜网站:LensCrafters
2020/01/19 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
人力资源总监工作说明
2014/03/03 职场文书
书香家庭事迹材料
2014/05/09 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
自荐信模板大全
2015/03/27 职场文书
行政答辩状范文
2015/05/21 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers