ThinkPHP笔记-命名空间与自动加载

命名空间

ThinkPHP/Library和Application下的目录名可作为根命名空间

//相当于实例化ThinkPHP/Library/Org/Util/Test.class.php
//如果Library下没找到,则实例化Application/Org/Util/Test.class.php
$obj = new \Org\Util\Test;
// 必须从根命名空间调用系统内置的类库或者第三方没有使用命名空间的类库
$class = new \stdClass();
$sxml = new \SimpleXmlElement($xmlstr);

手动加载第三方类库

// 导入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方法是无法导入具有点号的类库文件的,因为点号会直接转化成斜线,例如我们定义了一个名称为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",dirname(__FILE__),".php");

类库映射

命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效。
例如:

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类库映射,如果有则自动加载类库映射定义的文件;
判断是否存在Library/Test目录,有则以该目录为初始目录加载;
判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;
如果以上都不成立,则以Test为模块目录进行初始目录加载;

你可能感兴趣的:(ThinkPHP笔记-命名空间与自动加载)