php2.3.2,自动加载 - ThinkPHP3.2完全开发手册
在3.2中,基本上无需手动加载类库文件,你可以很方便的完成自动加载。
命名空间自动加载
系统可以通过类的命名空间自动定位到类库文件,例如:
我们定义了一个类 Org\Util\Auth 类:
namespace Org\Util;
class Auth {
}
保存到 ThinkPHP/Library/Org/Util/Auth.class.php。
接下来,我们就可以直接实例化了。
new \Org\Util\Auth();
在实例化Org\Util\Auth类的时候,系统会自动加载 ThinkPHP/Library/Org/Util/Auth.class.php 文件。
框架的Library目录下面的命名空间都可以自动识别和定位,例如:
├─Library 框架类库目录
│ ├─Think 核心Think类库包目录
│ ├─Org Org类库包目录
│ ├─ ... 更多类库目录
Library目录下面的子目录都是一个根命名空间,也就是说以Think、Org为根命名空间的类都可以自动加载:
new Think\Cache\Driver\File();
new Org\Util\Auth();
new Org\Io\File();
都可以自动加载对应的类库文件。
你可以在Library目录下面任意增加新的目录,就会自动注册成为一个新的根命名空间。
注册新的命名空间
除了Library目录下面的命名空间之外,我们还可以注册其他的根命名空间,例如:
'AUTOLOAD_NAMESPACE' => array(
'My' => THINK_PATH.'My',
'One' => THINK_PATH.'One',
)
配置了上面的AUTOLOAD_NAMESPACE后,如果我们实例化下面的类库
new My\Net\IpLocation();
new One\Util\Log();
会自动加载对应的类库文件
ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php
如果命名空间不在Library目录下面,并且没有定义对应的AUTOLOAD_NAMESPACE参数的话,则会当作模块的命名空间进行自动加载,例如:
new Home\Model\UserModel();
new Home\Event\UserEvent();
由于ThinkPHP/Library目录下面不存在Home目录,也没在AUTOLOAD_NAMESPACE参数定义Home命名空间,所以就把Home当成模块命名空间来识别,所以会自动加载:
Application/Home/Model/UserModel.class.php
Application/Home/Event/UserEvent.class.php
注意:命名空间的大小写需要和目录名的大小写对应,否则可能会自动加载失败。
类库映射
遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射。命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:
Think\Think::addMap('Think\Log',THINK_PATH.'Think\Log.php');
Think\Think::addMap('Org\Util\Array',THINK_PATH.'Org\Util\Array.php');
也可以利用addMap方法批量导入类库映射定义,例如:
$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Array.php');
Think\Think::addMap($map);
当然,比较方便的方式是我们可以在模块配置目录下面创建alias.php文件用于定义类库映射,该文件会自动加载,定义方式如下:
return array(
'Think\Log' => THINK_PATH.'Think\Log.php',
'Org\Util\Array' => THINK_PATH.'Org\Util\Array.php'
);
自动加载的优先级
在实际的应用类库加载过程中,往往会涉及到自动加载的优先级问题,以Test\MyClass类为例,自动加载的优先顺序如下:
判断是否有注册了Test\MyClass类库映射,如果有则自动加载类库映射定义的文件;
判断是否存在Library/Test目录,有则以该目录为初始目录加载;
判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;
如果以上都不成立,则以Test为模块目录进行初始目录加载;
以上面获取到的初始目录加载命名空间对应路径的文件;
手动加载第三方类库
如果要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,我们都可以通过手动导入的方式加载。
我们可以使用import方法导入任何类库,用法如下:
// 导入Org类库包 Library/Org/Util/Date.class.php类库
import("Org.Util.Date");
// 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库
import("Home.Util.UserUtil");
// 导入当前模块下面的类库
import("@.Util.Array");
// 导入Vendor类库包 Library/Vendor/Zend/Server.class.php
import('Vendor.Zend.Server');
对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP可以自动识别的类库包包括Think、Org、Com、Behavior和Vendor包,以及Library目录下面的子目录,如果你在Library目录下面创建了一个Test子目录,并且创建了一个UserTest.class.php类库,那么可以这样导入:
import('Test.UserTest');
其他的就认为是应用类库导入。
注意,如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,例如:
import('Test.UserTest');
$test = new \UserTest();
按照系统的规则,import方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为User.Info.class.php 的文件的话,采用:
import("Org.User.Info");
方式加载的话就会出现错误,导致加载的文件不是Org/User.Info.class.php 文件,而是Org/User/Info.class.php 文件,这种情况下,我们可以使用:
import("Org.User#Info");
来导入。
大多数情况下,import方法都能够自动识别导入类库文件的位置,如果是特殊情况的导入,需要指定import方法的第二个参数作为起始导入路径。例如,要导入当前文件所在目录下面的
RBAC/AccessDecisionManager.class.php 文件,可以使用:
import("RBAC.AccessDecisionManager",dirname(__FILE__));
如果你要导入的类库文件名的后缀不是class.php而是php,那么可以使用import方法的第三个参数指定后缀:
import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");
注意:在Unix或者Linux主机下面是区别大小写的,所以在使用import方法的时候要注意目录名和类库名称的大小写,否则会导入失败。
如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。
例如,我们把 Zend 的 Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是
Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
Vendor('Zend.Filter.Dir');
就可以导入Dir类库了。
Vendor方法也可以支持和import方法一样的基础路径和文件名后缀参数,例如:
Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');
php2.3.2,自动加载 - ThinkPHP3.2完全开发手册相关推荐
- PHP自动加载类—__autoload()和spl_autoload_register()
test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...
- PHP PSR-4 Autoloader 自动加载(中文版)
引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...
- jquery仿邮箱文本输入框自动加载邮箱后缀
jquery仿邮箱文本输入框自动加载邮箱后缀 在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错 ...
- Win8 x64 + Office Word 2013 x64 无法自动加载 Endnote X6 的解决方案
此篇技术解决贴之前发布在PLOB上,阅读7700+,原文链接 https://www.plob.org/article/5932.html .最近新开了自己的CSDN博客,重发自己的原创作品. 问题描 ...
- php点击按钮加载控制器,php – Codeigniter 3自动加载控制器
我在codeigniter中使用REST Server,使用的方法是在我的应用程序中使用所有控制器,我必须在开始时写下这一行: require APPPATH . '/libraries/REST_C ...
- php的_autoload函数实现自动加载类的使用
本文章详细的以实例来介绍了关于php _autoload自动加载类的用法以及如何使用_autoload来减少程序上的include和require的调用哦. 在使用PHP的OO模式开发系统时,通常大家 ...
- PHP自动加载类函数__autoload
这个也不是新技术,不过还是有必要写下.在我们加类的时候,一般需要将类文件包含进来不管用include还是require.php提供了一个魔术方法__autoload(),可以自动加载,不过根据不同的开 ...
- [PHP] 自动加载的实现
基于psr的规范,使用命名空间和spl_autoload_register()来实现自动加载 文件结构: |--Api |--Account.php |--User.php |--Service |- ...
- phpexcel的自动加载与其他框架有冲突
2019独角兽企业重金招聘Python工程师标准>>> 一直想用phpEXCEL,这次这个项目遇到了.然而坑也出来了.phpexcel的Autoloader.php里面 public ...
- php自动加载类与路由,PHP实现路由与类自动加载步骤详解
这次给大家带来PHP实现路由与类自动加载步骤详解,PHP实现路由与类自动加载步骤详解的注意事项有哪些,下面就是实战案例,一起来看一下. 项目目录如下 入口文件index.php<?php def ...
最新文章
- log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
- numpy安装_Python进阶之NumPy快速入门(一)
- mysql 索引效果是否叠加_MySQL基础实用知识集合(二)
- php熊掌号怎么设置json-ld,dedecms织梦系统对接百度熊掌号并添加JSON_LD数据
- vue:无法将“vue”识别为脚本_「前端架构」React和Vue -CTO的选择正确框架的指南...
- 华容道6×6图解_解放重卡促销盘点,四款6×4牵引车最低只要27.2万元
- 电子商务系统的设计与实现(五):账务系统的功能接口设计
- memcached全面剖析–5. memcached的应用和兼容程序(转)
- oracle10g下载与安装教程,Oracle10g安装图解与Oracle10g卸载教程
- 《Java核心技术36讲》读后
- js函数学习--用户输入年份判断当年是闰年还是平年,当年二月有多少天
- 【每天play】为了学好python需要从脚下做起,Linux基础-用户权限与组管理 P60-70
- 阿里云服务器价格,最新收费标准报价及活动价格表
- 光影学习 - 三点光照
- 对LARS(Least Angle Regression)的简单理解
- python算三角形面积怎么样保留两位小数_通过坐标计算三角形面积
- 手机上的python怎么运行,python在手机上怎么操作
- DotAsterisk(点星PBX)IPPBX V4.5在Hyper-V虚拟机中的安装
- day10作业-韩明琰
- 统计学方法机器学习实战(二) K近邻算法
热门文章
- sxssfworkbook 设置单元格大小_Offset属性和Resize属性相结合,完美实现选择区域大小的改变...
- 头条限流是什么原因_教训:千万不要用百家号去绑定头条号,后果你想象不到...
- Unix下oracle备份,Linux下Oracle备份与数据迁移
- 第34届越秀区青少年科技创新大赛_创客集结号上报名已开始啦
- Vue slot用法(2018.09.05 星期三)
- pg_stat wait timeout
- MySQL的Grant命令[转]
- 【转载】C++引用详解
- php laravel 相关收集
- Microsoft 安全公告 MS12-020 - 严重。请大家关注!!