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 相关文章推荐
我的论坛源代码(五)
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
php5 图片验证码实现代码
Dec 11 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
关于PHP语言构造器介绍
Jul 08 PHP
浅析51个PHP处理字符串的函数
Aug 02 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 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
PHP静态新闻列表自动生成代码
2007/06/14 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
jQuery.buildFragment使用方法及思路分析
2013/01/07 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
Python 线程池用法简单示例
2019/10/02 Python
python 常见的反爬虫策略
2020/09/27 Python
什么是.net
2015/08/03 面试题
什么是会话Bean
2015/05/14 面试题
自我评价范文
2013/12/22 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
教职工代表大会主持词
2014/04/01 职场文书
消防安全责任书
2014/04/14 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android