Zend的AutoLoad机制介绍
2015-01-24信息快讯网
在使用zend framework的时候,最先引入的一定是AutoLoad的机制,这里就想分析下Zend的AutoLoad是怎么引入的
代码示例set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path()); require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::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_Loader_Autoloader: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打印出来是这样的
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机制就阅读完了。
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
解析centos中Apache、php、mysql 默认安装路径
探讨:如何使用PhpDocumentor生成文档
解析如何修改phpmyadmin中的默认登陆超时时间
解析php addslashes()与addclashes()函数的区别和比较
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
解析phpstorm + xdebug 远程断点调试
hadoop中一些常用的命令介绍
hadoop常见错误以及处理方法详解
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
深入PHP autoload机制的详解
PHP autoload与spl_autoload自动加载机制的深入理解
spl_autoload_register与autoload的区别详解
phpcms模块开发之swfupload的使用介绍
php中使用__autoload()自动加载未定义类的实现代码
php流量统计功能的实现代码
说说PHP的autoLoad自动加载机制
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
PHP的autoload机制的实现解析
header跳转和include包含问题详解
关于UEditor编辑器远程图片上传失败的解决办法
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
php中jQuery插件autocomplate的简单使用笔记
PHP __autoload()方法真的影响性能吗?
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
php _autoload自动加载类与机制分析