作者:小鱼014999 | 来源:互联网 | 2015-11-26 02:24
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, 最重要的是将会抛出一个非常有用的警告(对于找出一个类加载失败非常有用)。
所以如果我们还需要注册我们自己的自动加载函数注意上面这个情况,不过我们也可以将自己的自动加载函数注册到第一个,spl_autoload_register('my_autoloader',true,true);第三个参数设为true就表示spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。
默认情况下,Yaf_Loader 收集所有library(类定义的脚本)储存进在 php.ini(yaf.library)定义的global library directory之中。如果你想使用 Yaf_Loader 搜索本地类(库)(定义在application.ini, 默认情况下,它是 application.directory . "/libraray"), 你需要使用 Yaf_Loader::registerLocalNameSpace() 注册本地类前缀。
Yaf_Loader类摘要
Yaf_Loader {
/* 属性 */
protected $_local_ns ;
protected $_library ;
protected $_global_library ;
static $_instance ;
/* 方法 */
public void autoload ( void )
public void clearLocalNamespace ( void )
private void __clone ( void )
public__construct ( void )
public static void getInstance ( void )
public Yaf_Loader getLibraryPath ([ bool $is_global = false ] )
public void getLocalNamespace ( void )
public static void import ( void )
public void isLocalName ( void )
public void registerLocalNamespace ([ mixed $prefix ] )
public Yaf_Loader setLibraryPath ( string $directory [, bool $is_global = false ] )
private void __sleep ( void )
private void __wakeup ( void )
}
成员方法列表
Yaf_Loader::autoload — The autoload purpose
Yaf_Loader::clearLocalNamespace — The clearLocalNamespace purpose
Yaf_Loader::__clone — The __clone purpose
Yaf_Loader::__construct — The __construct purpose
Yaf_Loader::getInstance — The getInstance purpose
Yaf_Loader::getLibraryPath — get the library path
Yaf_Loader::getLocalNamespace — The getLocalNamespace purpose
Yaf_Loader::import — The import purpose
Yaf_Loader::isLocalName — The isLocalName purpose
Yaf_Loader::registerLocalNamespace — 注册本地类前缀
Yaf_Loader::setLibraryPath — 改变library路径
Yaf_Loader::__sleep — The __sleep purpose
Yaf_Loader::__wakeup — The __wakeup purpose
下面通过实例了解Yaf_Loader的加载函数规则(假设 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 注册本地命名空间
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
在PHP 5.3中,你可以使用命名空间:
Example #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类,响应的规则如下:
Example #5 MVC类加载例子
Controller Classes =>
// APPLICATION_PATH/controllers/
Model Classes =>
// APPLICATION_PATH/models/
Plugin Classes =>
// APPLICATION_PATH/plugins/
Yaf 通过识别一个类的后缀(这个是默认的,你也可以通过改变配置项 yaf.name_suffix 来将它改为通过前缀识别)来决定它是否是一个MVC类:
Example #6 MVC 类区别
Controller Classes =>
// ***Controller
Model Classes =>
// ***Model
Plugin Classes =>
// ***Plugin
some examples:
Example #7 MVC loading example
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