在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完全开发手册相关推荐

  1. PHP自动加载类—__autoload()和spl_autoload_register()

    test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...

  2. PHP PSR-4 Autoloader 自动加载(中文版)

    引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...

  3. jquery仿邮箱文本输入框自动加载邮箱后缀

    jquery仿邮箱文本输入框自动加载邮箱后缀 在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错 ...

  4. Win8 x64 + Office Word 2013 x64 无法自动加载 Endnote X6 的解决方案

    此篇技术解决贴之前发布在PLOB上,阅读7700+,原文链接 https://www.plob.org/article/5932.html .最近新开了自己的CSDN博客,重发自己的原创作品. 问题描 ...

  5. php点击按钮加载控制器,php – Codeigniter 3自动加载控制器

    我在codeigniter中使用REST Server,使用的方法是在我的应用程序中使用所有控制器,我必须在开始时写下这一行: require APPPATH . '/libraries/REST_C ...

  6. php的_autoload函数实现自动加载类的使用

    本文章详细的以实例来介绍了关于php _autoload自动加载类的用法以及如何使用_autoload来减少程序上的include和require的调用哦. 在使用PHP的OO模式开发系统时,通常大家 ...

  7. PHP自动加载类函数__autoload

    这个也不是新技术,不过还是有必要写下.在我们加类的时候,一般需要将类文件包含进来不管用include还是require.php提供了一个魔术方法__autoload(),可以自动加载,不过根据不同的开 ...

  8. [PHP] 自动加载的实现

    基于psr的规范,使用命名空间和spl_autoload_register()来实现自动加载 文件结构: |--Api |--Account.php |--User.php |--Service |- ...

  9. phpexcel的自动加载与其他框架有冲突

    2019独角兽企业重金招聘Python工程师标准>>> 一直想用phpEXCEL,这次这个项目遇到了.然而坑也出来了.phpexcel的Autoloader.php里面 public ...

  10. php自动加载类与路由,PHP实现路由与类自动加载步骤详解

    这次给大家带来PHP实现路由与类自动加载步骤详解,PHP实现路由与类自动加载步骤详解的注意事项有哪些,下面就是实战案例,一起来看一下. 项目目录如下 入口文件index.php<?php def ...

最新文章

  1. log nginx 客户端请求大小_后端实践:Nginx日志配置(超详细)
  2. numpy安装_Python进阶之NumPy快速入门(一)
  3. mysql 索引效果是否叠加_MySQL基础实用知识集合(二)
  4. php熊掌号怎么设置json-ld,dedecms织梦系统对接百度熊掌号并添加JSON_LD数据
  5. vue:无法将“vue”识别为脚本_「前端架构」React和Vue -CTO的选择正确框架的指南...
  6. 华容道6×6图解_解放重卡促销盘点,四款6×4牵引车最低只要27.2万元
  7. 电子商务系统的设计与实现(五):账务系统的功能接口设计
  8. memcached全面剖析–5. memcached的应用和兼容程序(转)
  9. oracle10g下载与安装教程,Oracle10g安装图解与Oracle10g卸载教程
  10. 《Java核心技术36讲》读后
  11. js函数学习--用户输入年份判断当年是闰年还是平年,当年二月有多少天
  12. 【每天play】为了学好python需要从脚下做起,Linux基础-用户权限与组管理 P60-70
  13. 阿里云服务器价格,最新收费标准报价及活动价格表
  14. 光影学习 - 三点光照
  15. 对LARS(Least Angle Regression)的简单理解
  16. python算三角形面积怎么样保留两位小数_通过坐标计算三角形面积
  17. 手机上的python怎么运行,python在手机上怎么操作
  18. DotAsterisk(点星PBX)IPPBX V4.5在Hyper-V虚拟机中的安装
  19. day10作业-韩明琰
  20. 统计学方法机器学习实战(二) K近邻算法

热门文章

  1. sxssfworkbook 设置单元格大小_Offset属性和Resize属性相结合,完美实现选择区域大小的改变...
  2. 头条限流是什么原因_教训:千万不要用百家号去绑定头条号,后果你想象不到...
  3. Unix下oracle备份,Linux下Oracle备份与数据迁移
  4. 第34届越秀区青少年科技创新大赛_创客集结号上报名已开始啦
  5. Vue slot用法(2018.09.05 星期三)
  6. pg_stat wait timeout
  7. MySQL的Grant命令[转]
  8. 【转载】C++引用详解
  9. php laravel 相关收集
  10. Microsoft 安全公告 MS12-020 - 严重。请大家关注!!