自动加载

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.phpThinkPHP/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.phpApplication/Home/Event/UserEvent.class.php

注意:命名空间的大小写需要和目录名的大小写对应,否则可能会自动加载失败

自动加载的优先级

在实际的应用类库加载过程中,往往会涉及到自动加载的优先级问题,以Test\MyClass类为例,自动加载的优先顺序如下:

  1. 判断是否有注册了Test\MyClass类库映射,如果有则自动加载类库映射定义的文件;

  2. 判断是否存在Library/Test目录,有则以该目录为初始目录加载;

  3. 判断是否有注册Test根命名空间,有则以注册的目录为初始目录加载;

  4. 如果以上都不成立,则以Test为模块目录进行初始目录加载;

以上面获取到的初始目录加载命名空间对应路径的文件

手动加载第三方类库

如果要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,我们都可以通过手动导入的方式加载。

我们可以使用import方法导入任何类库,用法如下:

(0)

相关推荐