(Yaf >=1.0.0)
Yaf_Loader 为Yaf引入了一个全面的自动加载解决方案。
第一次获取Yaf_Application的实例时,Yaf_Loader 将实例化一个单例,并使用spl_autoload注册自身。您可以使用Yaf_Loader::getInstance()获取实例。
Yaf_Loader 只尝试加载一次类,如果失败,则取决于yaf.use_spl_auload,如果此配置为开启,Yaf_Loader::autoload() 将返回false
,从而为其他自动加载函数提供机会。如果它为关闭(默认情况下),Yaf_Loader::autoload() 将返回true
,更重要的是,将触发一个非常有用的警告(非常有助于找出为什么无法加载类)。
注意:
除非某些库有自己的自动加载机制且无法重写,否则请保持yaf.use_spl_autoload为关闭。
默认情况下,Yaf_Loader 假设所有库(定义类的脚本)都存储在全局库目录中,该目录在php.ini(yaf.library)中定义。
如果您希望Yaf_Loader 在本地类目录(在application.ini中定义,默认情况下为application.directory . "/library")中搜索某些类(库),则应使用Yaf_Loader::registerLocalNameSpace()注册类前缀。
让我们看一些例子(假设APPLICATION_PATH是application.directory)
示例 #1 配置示例
// Assuming the following configure in php.ini: yaf.library = "/global_dir" //Assuming the following configure in application.ini application.library = APPLICATION_PATH "/library"
示例 #2 注册本地命名空间
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initLoader($dispatcher) {
Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
}
?>
示例 #3 加载类示例
class Foo_Bar_Test => // APPLICATION_PATH/library/Foo/Bar/Test.php class GLO_Name => // /global_dir/Glo/Name.php class BarNon_Test // /global_dir/Barnon/Test.php
示例 #4 加载命名空间类示例
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.php class \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
您可能注意到所有文件夹的首字母都大写,您可以通过在php.ini中设置yaf.lowcase_path = On将其设置为小写。
Yaf_Loader 还设计用于加载MVC类,规则如下:
示例 #5 MVC类加载示例
Controller Classes => // APPLICATION_PATH/controllers/ Model Classes => // APPLICATION_PATH/models/ Plugin Classes => // APPLICATION_PATH/plugins/
示例 #6 MVC类区分
Controller Classes => // ***Controller Model Classes => // ***Model Plugin Classes => // ***Plugin
示例 #7 MVC加载示例
class IndexController // APPLICATION_PATH/controllers/Index.php class DataModel => // APPLICATION_PATH/models/Data.php class DummyPlugin => // APPLICATION_PATH/plugins/Dummy.php class A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php
此外,目录将受yaf.lowcase_path影响。注意:
从2.1.18版本开始,Yaf支持用户脚本端控制器自动加载(这意味着由用户PHP脚本触发的自动加载,例如:在Bootstrap或插件中访问控制器静态属性),但自动加载器只尝试在默认模块文件夹“APPLICATION_PATH/controllers/”下定位控制器类脚本。
默认情况下,此值为 application.directory . "/library",您可以在 application.ini (application.library) 中更改此值,或者调用 Yaf_Loader::setLibraryPath()