1.命名空间自动加载
在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载。
系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\Util\Auth类:
namespace Org\Util;
class Auth {
}
保存到ThinkPHP/Library/Org/Util/Auth.class.php
这样我们就可以直接实例化了,
new \Org\Util\Auth();
实例化之后系统会自动加载
ThinkPHP/Library/Org/Util/Auth.class.php
框架Liberary目录下的命名空间都可以自动识别和定位,如下
Library 框架类库目录
│ ├─Think 核心Think类库包目录
│ ├─Org Org类库包目录
│ ├─ ... 更多类库目录
Library目录下的子目录都是一个根命名空间,就是说Think,Org下的类都可以自动加载
new Think\Cache\Driver\File();
new Org\Util\Auth();
new Org\Io\File();
都可以自动加载对应的类库文件。
我们还可以在Liberary目录下面任意增加新的目录,就会自动注册成为一个新的根命名空间,如下:
'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目录下面,并且没有定义对应的AUTO_LOADNAMESPACE参数的话则会当做模块的命名空间自动加载,例如
new Home\Model\UserModel();
new Home\Event\UserEvent();
这跳跃有点大,刚才讲的还是Liberary下的命名空间,现在又扯到Application下的。
由于ThinkPHP/Library目录下面不存在Home目录,也没在AUTOLOAD_NAMESPACE参数定义Home命名空间,所以就把Home当成模块命名空间来识别,所以会自动加载
Application/Home/Model/UserModel.class.php
Application/Home/Event/UserEvent.class.php
这些命名空间貌似都是ThinkPHP\Liberary目录下的,这个目录下的东西一般不会修改的啊,不明白为什么没有说Application目录下的命名空间。
2.类库映射
定义了较多的命名空间效率会有所影响,可以给常用的类库定义类库映射,命名空间映射相当于给类文件定义了一个别名,例如:
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);
文档中依旧没有说明这段应该写在什么地方,是config.php还是入口文件里呢,捉急啊。
3.类库加载的优先级
在实际的类库加载过程中,往往会涉及到自动加载优先级的问题,以Test\MyClass为例,自动加载的优先级顺序如下:
1.判断是否注册了Test\MyClass类库映射,如果有则自动加载类库映射定义的文件,
2.判断是否存在Liberary\Test目录,有则以该目录为初始目录加载
3.判断是否注册了Test根命名空间,有则以注册的目录为初始目录加载
4.以上都不成立则以Test模块模块经行初始目录加载,
4.手动加载第三方类库
使用第三方类库的时候可能出现以下情况,不符合ThinkPHP命名空间和后缀,没有使用命名空间或者命名空间和路径不一致,我们可以使用手动导入的方式加载。
我们使用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,以及Liberary目录下的子目录,这不扯犊子啊,Think,Org,Com,Behavior,Vendor就在ThinkPHP\Liberary下,文档中所说的Liberary目录是指那个目录呢?哦,有可能文档中所说的是Liberary目录下自己新建的目录,有可能。
如果在Liberary目录下新建了一个Test目录,并创建了一个UserTest.class.php文件可以这样导入:
import('Test.UserTest');
注意如果没有使用namespace来定义命名空间的话,实例化的时候需要使用根命名空间,如下:
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可以自动识别导入类库文件的位置,特殊情况下需要第二个参数来指定起始导入的路径,例如:要导入当前文件所在目录下的RBAC/AccessDecisionManager.class.php 文件,可以使用import("RBAC.AccessDecisionManager",dirname(__FILE__)); 。 如果要导入的文件后缀不是class.php而是.php,可以使用第三个参数import("RBAC.AccessDecisionManager",dirname(__FILE__),".php");
如果第三方的类库放在Vendor目录下,以.php为文件后缀,也没有采用命名空间可以采用系统内部的Vendor函数简化导入,例如我们要把Zend的Filter\Dir.php放到Vendor目录下面,这个时候Dir文件的路径就是Vendor\Zend\Filter\Dir.php,使用Vendor方法导入如下:
Vendor('Zend.Filter.Dir');
Vendor方法也可以支持和import一样的基础路径和文件后缀参数,如下:
Vendor('Zend.Filter.Dir',dirname(__FILE__),'.class.php');
感觉高上大的,这些貌似是对系统进行扩展的时候使用的比较多。
thinkphp学习笔记9—自动加载的更多相关文章
-
ThinkPHP 3.2.3 自动加载公共函数文件的方法
方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ...
-
ThinkPHP5.0源码学习之注册自动加载
ThinkPHP5框架的自动注册加载流程如下:
-
Spring学习笔记(1)——资源加载
<!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...
-
node 学习笔记 - Modules 模块加载系统 (1)
本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...
-
Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)
本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...
-
node 学习笔记 - Modules 模块加载系统 (2)
本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...
-
【EF学习笔记08】----------加载关联表的数据 显式加载
显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...
-
【EF学习笔记07】----------加载关联表的数据 贪婪加载
讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...
-
【EF学习笔记06】----------加载关联表的数据 延迟加载
讲解之前,先来看一下我们的数据库结构:班级表 学生表 延迟加载 //延迟加载 using (var db = new Entities()) { //查询班级 var classes = (from ...
随机推荐
-
JS 模板引擎 BaiduTemplate 和 ArtTemplate 对比及应用
最近做项目用了JS模板引擎渲染HTML,JS模板引擎是在去年做项目是了解到的,但一直没有用,只停留在了解层面,直到这次做项目才用到,JS模板引擎用了两个 BaiduTemplate 和 ArtTemp ...
-
HTML5视频Video 音频Audio
视频协议 视频格式 Flash HTML5 HTTP flv HTTP f4v HTTP mp4 HTTP m3u8 HTTP webm HTTP ogg RTMP flv RTMP f4v RTMP ...
-
android handler 简介
android的handler 是一个神奇东西,处理异步消息的时候,我们离不开他.那么他的具体的介绍是什么了? Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息 ...
-
[SAP ABAP开发技术总结]程序自己以JOB方式运行
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
-
我想有个梦想(I want have a dream)
成东青说过:梦想是什么,梦想就是你坚持就觉得是幸福东西. 多好啊,有梦想,想想就觉得幸福的.也许你会觉得有点做作,但我真觉得是这样.没有梦想就像一个没有了灵魂的躯壳,整天浑浑噩噩,整天麻木的上班下班, ...
-
【C++】统计代码覆盖率(二)
嗷嗷嗷!!!好激动,我好蠢.不过最后还是解决了.呜呜呜 有些都是东一块西一块查的,如果有侵权欢迎私信我,我注明出处. 一 gcov&CMake 昨天试了下测试代码和被测代码都是c++的情况,直 ...
-
【js】前端 js/jquery 常用代码和实践
1.获取某天后几天的日期 //d为传入的日期 days为d后面的几天function getAfterDate(d,days){ var dd = new Date(d); dd.setDate(dd ...
-
好久没考虑过的 sql 注入
很多年没考虑 sql 注入了,毕业以后 使用mybatis #{ 参数的 语法 },这个 语法已经 做了防止 sql 注入的处理 . 看到同事写的 ${ 参数 },突然 想到这个问题 . 下面聊聊 s ...
-
Linux文件共享(单进程之间、多进程之间)
转载:https://www.cnblogs.com/frank-yxs/p/5925603.html 在同一个进程中,实现文件共享的方法有两种: 多次使用open函数打开相同文件 使用dup/dup ...
-
delphi tcp/ip IdTCPServer1实例一
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...