©
This document uses PHP Chinese website manual Release
(Yaf >=1.0.0)
Yaf_Loader 类为Yaf提供了自动加载功能的全面解决方案。
在第一次使用的时候,将检索 Yaf_Application 的实例, Yaf_Loader 实现了单利模式,并使用spl_autoload注册它自己。 通过 Yaf_Loader::getInstance() 返回它的实例
Yaf_Loader 加载一个类时仅仅尝试一次,如果失败了, 后面的操作将取决于yaf.use_spl_auload, 如果这个配置项为On, Yaf_Loader::autoload() 将会返回FALSE, 从而把机会让给其他的自动加载功能。如果这个配置项为Off(默认), Yaf_Loader::autoload() 将会返回TRUE, 最重要的是将会抛出一个非常有用的警告(对于找出一个类加载失败非常有用)。
Note:
请保持yaf.use_spl_autoload保持关闭,除非有一些library有自己的autoload机制,并且是无法改写的。
默认情况下,Yaf_Loader 收集所有library(类定义的脚本)储存进在 php.ini(yaf.library)定义的global library directory之中。
如果你想使用 Yaf_Loader 搜索本地类(库)(定义在application.ini, 默认情况下,它是 application.directory . "/libraray"), 你需要使用 Yaf_Loader::registerLocalNameSpace() 注册本地类前缀。
让我们来看看一些例子(假设 APPLICATION_PATH 是 application.directory):
Example #1 Config example
// Assuming the following configure in php.ini: yaf.libraray = "/global_dir"//Assuming the following configure in application.ini application.libraray = APPLICATION_PATH "/library"
Example #2 注册本地命名空间
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initLoader ( $dispatcher ) {
Yaf_Loader :: getInstance ()-> registerLocalNameSpace (array( "Foo" , "Bar" ));
}
?>
Example #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
Example #4 加载命名空间类
class \Foo\Bar\Dummy => // APPLICATION_PATH/library/Foo/Bar/Dummy.phpclass \FooBar\Bar\Dummy => // /global_dir/FooBar/Bar/Dummy.php
你可能会注意到所有文件夹名字的首字母是大写的,你可以通过在php.ini中设置 yaf.lowcase_path = On 来将它们小写。
Yaf_Loader 也是设计来加载MVC类,响应的规则如下:
Example #5 MVC类加载例子
Controller Classes => // APPLICATION_PATH/controllers/Model Classes => // APPLICATION_PATH/models/Plugin Classes => // APPLICATION_PATH/plugins/
Example #6 MVC 类区别
Controller Classes => // ***ControllerModel Classes => // ***ModelPlugin Classes => // ***Plugin
Example #7 MVC loading example
class IndexController // APPLICATION_PATH/controllers/Index.phpclass DataModel => // APPLICATION_PATH/models/Data.phpclass DummyPlugin => // APPLICATION_PATH/plugins/Dummy.phpclass A_B_TestModel => // APPLICATION_PATH/models/A/B/Test.php
$is_global
= false
] )$prefix
] )$directory
[, bool $is_global
= false
] )默认情况下,它的值是 application.directory . "/library", 你可以通过修改application.ini(application.library)或者调用 Yaf_Loader::setLibraryPath() 改变它。