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
实用函数7
Nov 08 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
php页面防重复提交方法总结
Nov 25 PHP
php实现短信发送代码
Jul 05 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
php的常量和变量实例详解
Jun 27 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
Laravel定时任务的每秒执行代码
Oct 22 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通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
2015/04/08 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
JS装饰器函数用法总结
2018/04/21 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
使用elementUI实现将图片上传到本地的示例
2018/09/04 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python中index()和seek()的用法(详解)
2017/04/27 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
python百行代码自制电脑端网速悬浮窗的实现
2020/05/12 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
《小石潭记》教学反思
2014/02/13 职场文书
给学校的建议书范文
2014/05/15 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
刘胡兰观后感
2015/06/16 职场文书
格林童话读书笔记
2015/06/30 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python