微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Zend的AutoLoad机制介绍

代码示例 <div class="codetitle"><a style="CURSOR: pointer" data="47095" class="copybut" id="copybut47095" onclick="doCopy('code47095')"> 代码如下:

<div class="codebody" id="code47095">
set_include_path(USVN_LIB_DIR . PATH_SEParaTOR . get_include_path());
require_once 'Zend/Loader/Autoloader.PHP';
$autoloader = Zend_LoaderAutoloader::getInstance();
$autoloader->registerNamespace("Zend
");
$autoloader->registerNamespace("USVN");
$autoloader->registerNamespace("menus
");
$config = new USVN_Config_Ini(USVN_CONfig_FILE,USVN_CONfig_SECTION);

过程分析


首先是设置了include_path,include_path就是PHP调用include的时候文件寻找的地址
下面就是 require_once 'Zend/Loader/Autoloader.PHP'; 在Zend/Loader/Autoloader.PHP文件内,读入了Zend/Loader.PHP, 这个PHP定义了Zend_Loader这个类,这个类包含了loadClass,loadFile,isReadable(文件是否可读)等函数
实例化Zend_Loader_Autoloader的过程就是调用其构造函数(这里是使用了单例模式)的过程 它的构造函数中的spl_autoload_register(array(CLASS,'autoload'));将Zend_Loader_Autoloader:autoload作为类自动加载函数
还做了一个操作将_internalAutoloader赋值了自身的_autoload 至于这里面是怎么autoload的等会根据具体例子查看
接下来调用了Zend_LoaderAutoloader:registerNamespace("USVN"),这个函数做的事就只是在Zend_Loader_AutoLoader的内部属性_namespaces上挂载一个key为USVN_和value为true的值。 看到这个函数就明白其实代码也可以写成 $autoloader->registerNamespace("Zend")->registerNamespace("USVN")
或者
$autoloader->registerNamespace(array("Zend","USVN")) 好了,现在到调用 USVN_Config_Ini类了
这个类自然走的就是Zend_Loader_Autoloader:autoload("USVN_Config_Ini")
这个函数第一步会去调用getClassAutoloaders获取这个类的AutoLoader。getClassAutoloaders里面增加了对namespaceAutoloader的选择和判断,由于我们很少使用,直接跳过 这里返回的loader打印出来是这样的
<div class="codetitle"><a style="CURSOR: pointer" data="38809" class="copybut" id="copybut38809" onclick="doCopy('code38809')"> 代码如下:
<div class="codebody" id="code38809">
Array ( [0] => Zend_Loader_Autoloader Object ( [_autoloaders:protected] => Array ( ) [_defaultAutoloader:protected] => Array ( [0] => Zend_Loader [1] => loadClass ) [_fallbackAutoloader:protected] => [_internalAutoloader:protected] => Array RECURSION [namespaces:protected] => Array ( [Zend] => 1 [ZendX] => 1 [USVN] => 1 [menus_] => 1 ) [_namespaceAutoloaders:protected] => Array ( ) [_suppressNotFoundWarnings:protected] => [_zfPath:protected] => ) [1] => _autoload )
其实就是前面设置的_internalAutoloader。 这里就会实际调用Zend_Loader_Autoloader:_autoload ("USVN_Config_Ini")
好了,现在就看到了Zend_Loader_Autoloader:_autoload函数 $callback = $this->getDefaultAutoloader();
这里会获取认的Autoloader,什么是认的Autoloader? 看这个类初始定义,实际上是array('Zend_Loader','loadClass');
下面自然就调用的是call_user_func($callback,$class);即Zend_Loader:loadClass("USVN_Config_Ini") 首先Zend_Loader已经在AutoLoader.PHP中被require了
其次我们看看Zend_Loader:loadClass方法,这个方法第一步是检查异常,跳过。第二步是将类分隔,拼凑成$file,比如USVN/Config/Ini.PHP,下面就直接调用self::loadFile($file,null,true); 接下来查看self::loadFile,
首先_securityCheck看类名中是否有非法字符,没有,就include了这个$file。这里的$file当然是相对路径,需要拼接上include_path,记得include_path是在哪里设置的吗?在程序的一开始就设置了!好了,这里就把USVN_Config_Ini这个类读取进来了。
看到这里你就该明白了,如果你自己定义了一个类,并且注册了Namespace,比如USVN,那么你就应该在include_path下面创建一个同名文件夹(大小写必须区分),然后你要引入的相对的文件路径名就是以类名的_做分隔读入的。 到这里AutoLoad机制就阅读完了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐