第 5 章 自动加载器

Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次.

[注意] 注意

但是要注意的一点是, 从2.1.18开始, Yaf支持在PHP脚本中触发对Controller的自动加载, 但是因为Controller的定位需要根据Module路由结果来判断, 这就造成了 在Bootstrap或者RouteStarrup之前, 无法确定. 所以, 对于Controller的加载, Yaf将只会尝试去加载默认Module的Controller, 也就是只在"{项目路径}/controllers" 目录下寻找

具体的目录映射规则如下:

表 5.1. Yaf目录映射规则

类型 后缀(或者前缀, 可以通过php.ini中ap.name_suffix来切换) 映射路径
控制器 Controller 默认模块下为{项目路径}/controllers/, 否则为{项目路径}/modules/{模块名}/controllers/
数据模型 Model {项目路径}/models/
插件 Plugin {项目路径}/plugins/


而对于非框架MVC相关的类, Yaf支持全局类和自身类的两种加载方式, 并且Yaf支持大小写敏感和不敏感两种方式来处理文件路径.

5.1. 全局类和自身类(本地类)

Yaf为了方便在一台服务器上部署的不同产品之间共享公司级别的共享库, 支持全局类和本地类两种加载方式.

全局类是指, 所有产品之间共享的类, 这些类库的路径是通过ap.library在php.ini(当然,如果PHP在编译的时候, 支持了with-config-file-scan-dir,那么也可以写在单独的ap.ini中)

而本地类是指, 产品自身的类库, 这些类库的路径是通过在产品的配置文件中, 通过yaf.library配置的.

在Yaf中, 通过调用Yaf_Loader的registerLocalNamespace方法, 来申明那些类前缀是本地类, 即可.
[注意] 注意
use_spl_autoload关闭的情况下, Yaf Autoloader在一次找不到的情况下, 会立即返回, 而剥夺其后的自动加载器的执行机会.
从Yaf 3.2.0开始,Yaf部分支持了PSR-4自动加载,你现在可以通过Yaf_Loader::registerNamespace注册一个命名空间以及一个 路径,Yaf对于在这个命名空间下的类都会去这个指定都路径去加载.
[注意] 注意
PSR-4自动加载只支持用户自己的类,不支持Yaf的Module,Controller的自动加载,如果你需要修改MVC的加载路径,你可以能需要调整yaf.directory配置,或者通过Yaf_Application::App()->setAppDirectory来设置