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中处理模拟rewrite 效果
Dec 09 PHP
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
PHP四大安全策略
Mar 12 PHP
php读取3389的脚本
May 06 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 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
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
ASP Json Parser修正版
2009/12/06 Javascript
限制文本框输入N个字符的js代码
2010/05/13 Javascript
jQuery操作 input type=checkbox的实现代码
2012/06/14 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
理解Javascript闭包
2013/11/01 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
jquery使用经验小结
2015/05/20 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
详解Angular2 之 结构型指令
2017/06/21 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
pandas取出重复数据的方法
2019/07/04 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
校长就职演讲稿
2014/01/06 职场文书
单位提档介绍信
2014/01/17 职场文书
文明学生事迹材料
2014/01/29 职场文书
班主任工作总结范文
2015/08/13 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android