## 概述
ThinkPHP5.0.0 真正实现了按需加载,所有类库采用自动加载机制,采用了两种方式来实现:命名空间和类库映射,并且支持composer类库的自动加载。
自动加载的实现由`\think\Loader`类库完成。
## 命名空间
由于新版ThinkPHP完全采用了命名空间的特性,因此只需要给类库正确定义所在的命名空间,而命名空间的路径与类库文件的目录一致,那么就可以实现类的自动加载。
例如,如果我们实例化`\think\log\driver\File`类的话:
~~~
$class = new \think\log\driver\File();
~~~
系统会自动加载 `thinkphp\library\think\log\driver\File.php` 文件。
如果实例化:
~~~
$class = new \org\UploadFile();
~~~
系统会自动加载 `thinkphp\library\org\UploadFile.php`文件。
如果不清楚什么是命名空间,可以参考PHP手册相关部分。这里就不对命名空间的用法做过多的描述了。
系统对根命名空间的检测顺序如下:
~~~
1、优先检测是否存在注册过的根命名空间
2、检测composer自动加载的类库
3、然后检测核心目录(LIB_PATH)下是否存在根命名空间的对应子目录
4、检测是否应用类库(APP_PATH)命名空间
5、检测扩展类库目录(EXTEND_PATH)下是否存在根命名空间对应的子目录
~~~
如果你需要额外的根命名空间的自动加载支持,可以首先注册根命名空间,例如:
~~~
\think\Loader::addNamespace('org',MY_PATH.'org/');
\think\Loader::addNamespace('com',MY_PATH.'com/');
~~~
> 注册的根命名空间优先,并且ThinkPHP5注册的命名空间根必须是小写。
注册新的命名空间支持后,我们就可以自动加载该命名空间下面的类库了。
## 类库映射
遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射。命名类库映射相当于给类文件定义了一个别名,效率会比命名空间定位更高效,例如:
~~~
\think\Loader::addMap('think\Log',LIB_PATH.'think\Log.php');
\think\Loader::addMap('org\util\Array',LIB_PATH.'org\util\Array.php');
~~~
也可以利用addMap方法批量导入类库映射定义,例如:
~~~
$map = ['think\Log'=>LIB_PATH.'think\Log.php','org\util\array'=>LIB_PATH.'org\util\Array.php'];
\think\Loader::addMap($map);
~~~
> 通过类库映射的方式注册的类可以不遵循命名空间必须对应子目录的规范。
## 类库导入
如果你不需要系统的自动加载功能,又或者没有使用命名空间的话,那么也可以使用Think\Loader类的import方法手动加载类库文件,例如:
~~~
\think\Loader::import('org.util.array');
\think\Loader::import('@.util.upload');
~~~
类库导入也采用类似命名空间的概念(但不需要实际的命名空间支持),支持的“根命名空间”包括:
|目录|说明|
|-|
|behavior| 系统行为类库|
|think| 核心基类库|
|org| 扩展类库包|
|com| 企业类库包|
|@| 表示当前模块类库包|
|vendor| 第三方类库|
|traits| 系统Traits类库|
~~~
如果完全遵从系统的命名空间定义的话,一般来说无需手动加载类库文件,直接实例化即可。
## Composer自动加载
5.0版本支持Composer安装的类库的自动加载,你可以直接按照Composer依赖库中的命名空间直接调用。