## 自动加载
TookPHP基本上无需手动加载类库文件,你可以很方便的完成自动加载。
### 命名空间自动加载
系统可以通过类的命名空间自动定位到类库文件,例如:
我们定义了一个类 `Util\Pay\Alipay` 类:
~~~
namespace Util\Pay;
class Alipay {
}
~~~
保存到 `Common/Library/Util/Alipay.class.php`。
接下来,我们就可以直接实例化了。
~~~
new \Util\Pay\Alipay();
~~~
在实例化`Util\Pay\Alipay`类的时候,系统会自动加载 `Application/Common/Library/Util/Pay/Alipay.class.php` 文件。
~~~
namespace Util\Pay;
class Alipay{
}
~~~
框架的`Library`目录下面的命名空间都可以自动识别和定位,例如:
~~~
├─Application 应用目录
│ ├─Common Common公共目录
│ ├─Library 公共目录类库目录
│ ├─Util Util类库包目录
│ ├─Org Org类库包目录
│ ├─... 更多类库目录
~~~
~~~
├─tookphp 框架类库目录
│ ├─Library 框架类库目录
│ ├─Took 核心类库包目录
│ ├─Tool 工具类库包目录
│ ├─Org Org类库包目录
│ ├─... 更多类库目录
~~~
~~~
new Took\Cache\Driver\File();
new Org\PHPExcel\PHPExcel();
new Util\Pay\Alipay();
~~~
都可以自动加载对应的类库文件。
### 注册命名空间
你可以在`Library`目录下面任意增加新的目录,就会自动注册成为一个新的根命名空间。
我们还可以注册其他的根命名空间,例如:
~~~
'APP_AUTOLOAD_NAMESPACE' => array(
'Util' => APP_COMMON_PATH.'Library/Util/'
'My' => APP_COMMON_PATH.'Library/My/'
)
~~~
配置了上面的`APP_AUTOLOAD_NAMESPACE`后,如果我们实例化下面的类库
~~~
new My\Net\IpLocation();
new Util\Log\Log();
~~~
会自动加载对应的类库文件
~~~
Common/Library/My/Net/IpLocation.class.php
Common/Library/Util/Log/Log.class.php
~~~
如果命名空间不在`Library`目录下面,并且没有定义对应的`APP_AUTOLOAD_NAMESPACE`参数的话,则会当作模块的命名空间进行自动加载,例如:
~~~
new Home\Model\UserModel()
new Home\Event\UserEvent();
~~~
由于`TookPHP/Library`目录下面不存在Home目录,也没在`APP_AUTOLOAD_NAMESPACE`参数定义`Home`命名空间,所以就把`Home`当成模块命名空间来识别,所以会自动加载:
~~~
Application/Home/Model/UserModel.class.php
Application/Home/Event/UserEvent.class.php
~~~
注意:命名空间的大小写需要和目录名的大小写对应,否则可能会自动加载失败。
### 路径自动加载
定义类库自动搜索路径自动加载
可以通过配置 `APP_AUTOLOAD_PATH` 参数(自动加载路径)来实现所需类库的自动加载。
//配置多个搜索路径之间用逗号分割,并且注意定义的顺序代表了搜索的顺序。
~~~
// APP_AUTOLOAD_PATH 配置实例如下:
//'APP_AUTOLOAD_PATH' => 'Common.Model',
'APP_AUTOLOAD_PATH' => 'Common.Model,Common.Library,@.Library',
//注: @表示当前模块下
~~~
需要注意的是,自动加载的类库文件命名必须是以 .class.php 为后缀的。