thinkphp学习笔记9—自动加载

时间:2021-10-25 04:15:35

原文: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目录下的命名空间都可以自动识别和定位,如下

  1. Library 框架类库目录
  2. │ ├─Think 核心Think类库包目录
  3. │ ├─Org Org类库包目录
  4. │ ├─ ... 更多类库目录

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—自动加载的更多相关文章

  1. ThinkPHP 3.2.3 自动加载公共函数文件的方法

    方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ...

  2. ThinkPHP5.0源码学习之注册自动加载

    ThinkPHP5框架的自动注册加载流程如下:

  3. Spring学习笔记(1)——资源加载

    <!-- 占坑,迟点补充底层原理 --> Spring支持4种资源的地址前缀 (1)从类路径中加载资源——classpath: classpath:和classpath:/是等价的,都是相 ...

  4. node 学习笔记 - Modules 模块加载系统 &lpar;1&rpar;

    本文同步自我的个人博客:http://www.52cik.com/2015/12/11/learn-node-modules-path.html 用了这么久的 require,但却没有系统的学习过 n ...

  5. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  6. node 学习笔记 - Modules 模块加载系统 &lpar;2&rpar;

    本文同步自我的个人博客:http://www.52cik.com/2015/12/14/learn-node-modules-module.html 上一篇讲了模块是如何被寻找到然后加载进来的,这篇则 ...

  7. 【EF学习笔记08】----------加载关联表的数据 显式加载

    显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...

  8. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...

  9. 【EF学习笔记06】----------加载关联表的数据 延迟加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 延迟加载 //延迟加载 using (var db = new Entities()) { //查询班级 var classes = (from ...

随机推荐

  1. JS 模板引擎 BaiduTemplate 和 ArtTemplate 对比及应用

    最近做项目用了JS模板引擎渲染HTML,JS模板引擎是在去年做项目是了解到的,但一直没有用,只停留在了解层面,直到这次做项目才用到,JS模板引擎用了两个 BaiduTemplate 和 ArtTemp ...

  2. HTML5视频Video 音频Audio

    视频协议 视频格式 Flash HTML5 HTTP flv HTTP f4v HTTP mp4 HTTP m3u8 HTTP webm HTTP ogg RTMP flv RTMP f4v RTMP ...

  3. android handler 简介

    android的handler 是一个神奇东西,处理异步消息的时候,我们离不开他.那么他的具体的介绍是什么了? Handler基本概念:      Handler主要用于异步消息的处理:当发出一个消息 ...

  4. &lbrack;SAP ABAP开发技术总结&rsqb;程序自己以JOB方式运行

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. 我想有个梦想&lpar;I want have a dream&rpar;

    成东青说过:梦想是什么,梦想就是你坚持就觉得是幸福东西. 多好啊,有梦想,想想就觉得幸福的.也许你会觉得有点做作,但我真觉得是这样.没有梦想就像一个没有了灵魂的躯壳,整天浑浑噩噩,整天麻木的上班下班, ...

  6. 【C&plus;&plus;】统计代码覆盖率&lpar;二&rpar;

    嗷嗷嗷!!!好激动,我好蠢.不过最后还是解决了.呜呜呜 有些都是东一块西一块查的,如果有侵权欢迎私信我,我注明出处. 一 gcov&CMake 昨天试了下测试代码和被测代码都是c++的情况,直 ...

  7. 【js】前端 js&sol;jquery 常用代码和实践

    1.获取某天后几天的日期 //d为传入的日期 days为d后面的几天function getAfterDate(d,days){ var dd = new Date(d); dd.setDate(dd ...

  8. 好久没考虑过的 sql 注入

    很多年没考虑 sql 注入了,毕业以后 使用mybatis #{ 参数的 语法 },这个 语法已经 做了防止 sql 注入的处理 . 看到同事写的 ${ 参数 },突然 想到这个问题 . 下面聊聊 s ...

  9. Linux文件共享(单进程之间、多进程之间)

    转载:https://www.cnblogs.com/frank-yxs/p/5925603.html 在同一个进程中,实现文件共享的方法有两种: 多次使用open函数打开相同文件 使用dup/dup ...

  10. delphi tcp&sol;ip IdTCPServer1实例一

    unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...