1.命名空间活动加载

1.命名空中活动加载

在3.第22中学,基本上无需手动加载类库文件,你能够很实惠的实现机关加载

在3.2版本中无需手动加载类库文件,可以很便利的姣好机关加载。

在3.2版本中没有须要手动加载类库文件,能够很便利的姣好机关加载。


系统能够根据类的命名空间活动定位到类库文件,比如定义了多个类Org\Util\Auth类:

系统能够依照类的命名空间活动定位到类库文件,比方定义了三个类Org\Util\Auth类:

一、命名空间活动加载

namespace Org\Util;  class Auth {  }
namespace Org\Util;
class Auth {
}

系统能够透过类的命名空间活动定位到类库文件,例如:

保存到ThinkPHP/Library/Org/Util/Auth.class.php

保存到ThinkPHP/Library/Org/Util/Auth.class.php

咱俩定义了多少个类 Org\Util\Auth 类:

那般大家就足以直接实例化了,

如此那般我们就能够直接实例化了,

namespace Org\Util;
class Auth {
}
new \Org\Util\Auth();
new \Org\Util\Auth();

保存到ThinkPHP/ Library/Org/Util/Auth.class.php。

实例化之后系统会自行加载

实例化之后系统会自行加载

接下去正是实例化了。

ThinkPHP/Library/Org/Util/Auth.class.php 

ThinkPHP/Library/Org/Util/Auth.class.php 

$auth=new \Org\Util\Auth()

框架Liberary目录下的命名空间都得以自动识别和固定,如下

框架Liberary目录下的命名空间都得以自动识别和确定地点,如下

在实例化Org\Util\Auth类的时候,系统会自动加载ThinkPHP/Library/Org/Util/Auth.class.php文件

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

框架的Libray目录上边包车型大巴命名空间都得以自动识别和一向,比方:

Library目录下的子目录都以三个根命名空间,就是说Think,Org下的类都能够自动加载

Library目录下的子目录都以一个根命名空间,正是说Think,Org下的类都足以自行加载

├─Library      框架类库目录
│  ├─Think     核心Think类库包目录
│  ├─Org       Org类库包目录
│  ├─ ...      更多类库目录
new Think\Cache\Driver\File();  new Org\Util\Auth();  new Org\Io\File();
new Think\Cache\Driver\File();
new Org\Util\Auth();
new Org\Io\File();

 Library目录下边包车型客车子目录都以三个根命名空间,约等于说以Think、org为根命名空间
的类都得以活动加载:

都能够活动加载对应的类库文件。

都能够活动加载对应的类库文件。

new Think\Cache\Driver\File();
new Org\Util\Auth();
new Org\Io\File();

我们还足以在Liberary目录上边任性扩张新的目录,就能够活动注册改成八个新的根命名空间,如下:

咱俩还足以在Liberary目录上边任意增添新的目录,就能活动注册成为二个新的根命名空间,如下:

都足以加载对应的类库文件。

'AUTOLOAD_NAMESPACE' => array(    'My'     => THINK_PATH.'My',    'One'    => THINK_PATH.'One',)
'AUTOLOAD_NAMESPACE' => array(    'My'     => THINK_PATH.'My',    'One'    => THINK_PATH.'One',)

您能够在Library目录下边大肆增添新的目录,就能自动注册成为三个新的根命名空间。

配备了地点的AUTOLOAD_NAMESPACE之后方可实例化上边包车型地铁类库

安顿了地点的AUTOLOAD_NAMESPACE之后方可实例化下边包车型客车类库


new My\Net\IpLocation();  new One\Util\Log();
new My\Net\IpLocation();
new One\Util\Log();

二、注册新的命名空间

电动加载上边包车型客车类库文件

机动加载下边包车型客车类库文件

出了Libray目录上边的命名空间之外,大家还能挂号别的的命名空间。比方:

ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php

ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php

'AUTOLOAD_NAMESPACE' => array(
    'My'     => THINK_PATH.'My',
    'One'    => THINK_PATH.'One',
)

设若命名空间不在Library目录上面,而且未有概念对应的AUTO_LOADNAMESPACE参数的话则会作为模块的命名空间活动加载,比如

只要命名空间不在Library目录上面,并且未有定义对应的AUTO_LOADNAMESPACE参数的话则会作为模块的命名空间活动加载,比方

配置方面包车型大巴AUTOLOAD_NAMESPACE后,假若大家实例化上面包车型地铁类库

new Home\Model\UserModel();  new Home\Event\UserEvent();
new Home\Model\UserModel();
new Home\Event\UserEvent();
new My\Net\IpLocation();
new One\Util\Log();

那跳跃有一些大,刚才讲的依旧Liberary下的命名空间,今后又扯到Application下的。

那跳跃有一点点大,刚才讲的还是Liberary下的命名空间,现在又扯到Application下的。

会活动加载对应的类库文件

由于ThinkPHP/Library目录下边不设有Home目录,也没在AUTOLOAD_NAMESPACE参数定义Home命名空间,所以就把Home当成模块命名空间来鉴定识别,所以会自行加载

出于ThinkPHP/Library目录上边不设有Home目录,也没在AUTOLOAD_NAMESPACE参数定义Home命名空间,所以就把Home当成模块命名空间来甄别,所以会活动加载

ThinkPHP/My/Net/IpLocation.class.php
ThinkPHP/One/Util/Log.class.php
Application/Home/Model/UserModel.class.php  Application/Home/Event/UserEvent.class.php
Application/Home/Model/UserModel.class.php
Application/Home/Event/UserEvent.class.php

假诺命名空间不在Library目录下面,而且未有定义对应的AUTOLOAD_NAMESPACE参数的话,则会作为当前模块的命名空间拓展机动加载,比方:

那几个命名空间貌似都是ThinkPHP\Liberary目录下的,那一个目录下的事物一般不会修改的哟,不知底怎么向来不说Application目录下的命名空间。

这几个命名空间貌似都以ThinkPHP\Liberary目录下的,那些目录下的事物一般不会修改的啊,不理解为什么一贯不说Application目录下的命名空间。

new Home\Model\UserModel()
new Home\Event\ UserEvent()

2.类库映射

2.类库映射

是因为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');
Think\Think::addMap('Think\Log',THINK_PATH.'Think\Log.php');
Think\Think::addMap('Org\Util\Array',THINK_PATH.'Org\Util\Array.php');

留心:命名空间的大小写必要与目录名的轻重缓急写对应,不然只怕会自行加载失利

那这段应该写在哪儿吧,文书档案未有说清楚。也可使用addMap方法批量导入类库映射定义,如下:

那这段应该写在何地呢,文档未有说通晓。也可使用addMap方法批量导入类库映射定义,如下:


$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Array.php');Think\Think::addMap($map);
$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Array.php');Think\Think::addMap($map);

 三、类库映射

文书档案中依旧未有申明这段应该写在什么地点,是config.php依旧进口文件里吧,捉急啊。

文档中照旧未有注脚这段应该写在怎么着地点,是config.php依然进口文件里呢,捉急啊。

依据大家地点的命名空间定义标准的话,基本上能够形成类库的电动加载了,然则只要定义了比较多的命名空间的话,效能会怀有下落,所以,大家得以给常用的类库定义类库映射。命名类库映射也正是给类公事定义了贰个别称,效能会比命名空间一定更连忙,举例:

3.类库加载的预先级

3.类库加载的事先级

Think\Think::addMap('Think\Log',THINK_PATH.'Think\Log.php');
Think\Think::addMap('Org\Util\Array',THINK_PATH.'Org\Util\Array.php');

在实际的类库加载进程中,往往会涉及到自动加载优先级的主题材料,以Test\MyClass为例,自动加载的先行级依次如下:

在事实上的类库加载进度中,往往会涉嫌到活动加载优先级的难点,以Test\MyClass为例,自动加载的事先级依次如下:

也足以动用addMap方法批量导入类库映射定义,比如:

1.判定是不是注册了Test\MyClass类库映射,假设有则自动加载类库映射定义的文书,

1.料定是或不是注册了Test\MyClass类库映射,即使有则自动加载类库映射定义的公文,

$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Array.php');
Think\Think::addMap($map);

2.推断是还是不是存在Liberary\Test目录,有则以该目录为开首目录加载

2.肯定是不是存在Liberary\Test目录,有则以该目录为早先目录加载

自然,相比较便利的秘诀是大家可以在模块配置目录下边创立alias.php文件用于定义类库映射,该公文子禽自动加载,定义方式如下:

3.判别是或不是注册了Test根命名空间,有则以登记的目录为起先目录加载

3.剖断是或不是注册了Test根命名空间,有则以登记的目录为开始目录加载

return array(
    'Think\Log'        =>    THINK_PATH.'Think\Log.php',
    'Org\Util\Array'   =>    THINK_PATH.'Org\Util\Array.php'
);

4.上述都不树立则以Test模块模块经行早先目录加载,

4.上述都不树立则以Test模块模块经行起初目录加载,


 

 

四、自动加载的开始时期级

4.手动加载第三方类库

4.手动加载第三方类库

在其实的行使类库加载进程中,往往会提到到机关加载的开始的一段时期级难点,以Test\MyClass类为例,自动加载的先行顺序如下:

应用第三方类库的时候大概出现以下处境,不符合ThinkPHP命名空间和后缀,未有行职责名空间依然命名空间和路线不均等,大家得以使用手动导入的秘籍加载。

应用第三方类库的时候大概出现以下景况,不吻合ThinkPHP命名空间和后缀,未有运用命名空间依然命名空间和路子不等同,大家能够运用手动导入的法子加载。

  1. 看清是还是不是有注册了Test\MyClass类库映射,借使有则自动加载类库映射定义的文书;
  2. 认清是还是不是留存Library/Test目录,有则以该目录为发轫目录加载;
  3. 决断是不是有登记Test根命名空间,有则以登记的目录为起先目录加载;
  4. 借使以上都不树立,则以Test为模块目录实行开首目录加载;

咱俩运用import方法导入类库,如下:

大家采用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');
// 导入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目录下本身新建的目录,有希望。

对此import方法,系统会自动识别导入类库文件的职位,ThinkPHP可以自动识其他类库包涵Think,Org,Com,Behavior,Vendor,以及Liberary目录下的子目录,那不扯犊子啊,Think,Org,Com,Behavior,Vendor就在ThinkPHP\Liberary下,文书档案中所说的Liberary目录是指这贰个目录呢?哦,有希望文书档案中所说的是Liberary目录下团结新建的目录,有不小希望。

五、手动加载第三方类库

假定在Liberary目录下新建了叁个Test目录,并创建了一个UserTest.class.php文件可以这么导入:

一经在Liberary目录下新建了叁个Test目录,并创制了四个UserTest.class.php文件可以如此导入:

如果要加载第三方类库,包蕴不符合命名标准和后缀的类库,以及从未采用命名空间照旧命名空间和路径不雷同的类库,可能你即使想手动加载类库文件,大家都可以通过手动导入的方式加载。

import(‘Test.UserTest’);

import(‘Test.UserTest’);

大家得以行使import方法导入任何类库,用法如下:

小心若无运用namespace来定义命名空间的话,实例化的时候需求使用根命名空间,如下:

细心如果未有运用namespace来定义命名空间的话,实例化的时候须要选择根命名空间,如下:

// 导入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('Test.UserTest');  $test = new \UserTest();
import('Test.UserTest');
$test = new \UserTest();

对于import方法,系统会自动识别导入类库文件的职位,ThinkPHP能够自动识别的类库托特包括Think、Org、Com、Behavior和Vendor包,以及Library目录上面包车型地铁子目录,假如您在Library目录下边成立了一个Test子目录,並且成立了一个UserTest.class.php类库,那么能够如此导入:

依据系统法则,import方法是心余力绌导入具有一些号的类库文件,因为点号会一直转化为斜线,比如假诺大家定义了七个User.Info.class.php文件的话选拔import(“Org.User.Info”);格局加载就能够产出谬误,导致大家加载到的不是Org/User.Info.class.php文件,而是Org/User/Info.class.php文件,这种情景下大家应用import(“Org.User#Info”);方式导入,那个就是文件名中的点号用#代替。

遵纪守法系统准绳,import方法是万般无奈导入具有一点号的类库文件,因为点号会直接转账为斜线,举个例子假使我们定义了二个User.Info.class.php文件的话选用import(“Org.User.Info”);形式加载就能够现出错误,导致大家加载到的不是Org/User.Info.class.php文件,而是Org/User/Info.class.php文件,这种情景下我们采用import(“Org.User#Info”);方式导入,那个正是文件名中的点号用#代替。

import('Test.UserTest');

 

 

其余的就觉着是应用类库导入。

大部气象下import能够自动识别导入类库文件的岗位,特殊情形下需求首个参数来钦命开端导入的路径,举个例子:要导入当前文件所在目录下的RBAC/AccessDecisionManager.class.php
文件,能够接纳import(“RBAC.AccessDecisionManager”,dirname(__FILE__));

若是要导入的文件后缀不是class.php而是.php,能够选择第八个参数import(“RBAC.AccessDecisionManager”,dirname(__FILE__),”.php”);

大许多意况下import可以自动识别导入类库文件的职责,特殊景况下必要第二个参数来钦定开头导入的路径,比如:要导入当前文件所在目录下的RBAC/AccessDecisionManager.class.php
文件,能够使用import(“RBAC.AccessDecisionManager”,dirname(__FILE__));

假设要导入的公文后缀不是class.php而是.php,能够使用第八个参数import(“RBAC.AccessDecisionManager”,dirname(__FILE__),”.php”);

只顾,假设你的类库未有使用命名空间定义的话,实例化的时候供给增添根命名空间,举个例子:

 

 

import('Test.UserTest');
$test = new \UserTest();

假若第三方的类库放在Vendor目录下,以.php为文件后缀,也绝非采纳命名空间能够运用系统里面包车型大巴Vendor函数简化导入,譬如大家要把Zend的Filter\Dir.php放到Vendor目录上边,那一年Dir文件的路径正是Vendor\Zend\Filter\Dir.php,使用Vendor方法导入如下:

假定第三方的类库放在Vendor目录下,以.php为文件后缀,也并未应用命名空间可以利用系统之中的Vendor函数简化导入,举个例子大家要把Zend的Filter\Dir.php放到Vendor目录上边,今年Dir文件的门路就是Vendor\Zend\Filter\Dir.php,使用Vendor方法导入如下:

依照系统的法则,import方法是心有余而力不足导入具备一点点号的类库文件的,因为点号会一向转化成斜线,比如大家定义了三个名号为User.Info.class.php
的文件的话,采纳:

Vendor(‘Zend.Filter.Dir’);

Vendor(‘Zend.Filter.Dir’);

import("Org.User.Info");

方式加载的话就会出现错误,导致加载的文件不是Org/User.Info.class.php 文件,而是Org/User/Info.class.php 文件,这种情况下,我们可以使用:

import("Org.User#Info");

Vendor方法也可以支撑和import同样的基本功路线和文件后缀参数,如下:

Vendor方法也足以协理和import一样的底蕴路线和文书后缀参数,如下:

好些个景观下,import方法都可以自动识别导入类库文件的地点,假诺是出格情状的导入,需求钦定import方法的第四个参数作为开场导入路线。举例,要导入当前文件所在目录下边包车型客车RBAC/AccessDecisionManager.class.php 文件,能够采纳:

Vendor(‘Zend.Filter.Dir’,dirname(__FILE__),’.class.php’);

Vendor(‘Zend.Filter.Dir’,dirname(__FILE__),’.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');

 

相关文章