thinkphp学习笔记9—自动加载
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 ...
随机推荐
- <a href='javascript:void(0)' onclick='my()'></a>
- Linux注意到Makefile
规则: 目标 : 依靠 命令 make是怎样工作的: (1)make在当前文件夹下寻找makefile或Makefile. (2)假设找到,他会寻找文件里的第一个目标文件(target).并把这个文件 ...
- Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画
这几天在看控件类,临时没有想好实际运用的方向.单纯的创建网上已经有非常多这方面的样例,我就不写了.接下来是学习精灵类.精灵类若是单独学习也是非常easy.于是我加了一些有关动画方面的知识点与精灵 ...
- C# WinForm多线程(二)ThreadPool 与 Timer
本文接上文,继续探讨WinForm中的多线程问题,再次主要探讨threadpool 和timer 一 ThreadPool 线程池(ThreadPool)是一种相对较简单的方法,它适应于一些需要多个 ...
- nodejs添加路由route步骤详解
首先,毋庸置疑, 新建一个基础express站点.建好之后, 有三个文件需要code(当然,三个步骤顺序随意). 下面以添加一个'/about'为例说明. 1. 在views文件夹里,新建一个jade ...
- CodeForces 484A Bits
意甲冠军: 10000询价 每次查询输入L和R(10^18) 在区间的二进制输出指示1大多数数字 1个数同样输出最小的 思路: YY一下 认为后几位全是1的时候能保证1的个数多 那么怎样构造 ...
- hdu 2454 Degree Sequence of Graph G (推断简单图)
///已知各点的度,推断是否为一个简单图 #include<stdio.h> #include<algorithm> #include<string.h> usin ...
- “MEAN”技术栈开发web应用
“MEAN”技术栈开发web应用 上一篇我们讲了如何使用angular搭建起项目的前端框架,前端抽象出一个service层来向后端发送请求,后端则返回相应的json数据.本篇我们来介绍一下,如何在no ...
- crm2011i创建nt类型字段
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft ...
- JS学习笔记-OO创建怀疑的对象
问了.工厂介绍,解决重码 前面已经提到,JS中创建对象的方法.不难发现,主要的创建方法中,创建一个对象还算简单,假设创建多个类似的对象的话就会产生大量反复的代码. 解决:工厂模式方法(加入一个专门创建 ...