Zend Framework中的AutoLoad机制

开发 后端
在使用zend framework的时候,最先引入的一定是AutoLoad的机制,这里就想分析下Zend的AutoLoad是怎么引入的。

代码示例

  1. set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path()); 
  2. require_once 'Zend/Loader/Autoloader.php'
  3. $autoloader = Zend_Loader_Autoloader::getInstance(); 
  4. $autoloader->registerNamespace("Zend_"); 
  5. $autoloader->registerNamespace("USVN_"); 
  6. $autoloader->registerNamespace("menus_"); 
  7. $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机制就阅读完了。

原文链接:http://www.cnblogs.com/yjf512/archive/2012/08/01/2619100.html

【编辑推荐】

  1. 为您介绍5个 PHP 安全措施
  2. PHP5.5 将会带来哪些新特征
  3. PHP 5.4.5和5.3.15发布,安全修复版本
  4. 漫谈社区PHP业务开发 提高效率缩短开发周期
  5. 看PHP如何生成的条形码

责任编辑:彭凡 来源: 博客园
相关推荐

2013-05-27 10:14:21

PHPZend FramewPHP编码

2021-01-26 10:00:45

漏洞网络安全网络攻击

2013-05-22 15:02:13

Zend Framew

2009-01-08 09:10:13

ZendRIAPHP

2010-01-06 15:35:01

.Net Framew

2009-08-26 14:52:19

.NET Framew

2010-01-05 16:10:21

.NET Framew

2010-01-06 19:38:16

.NET Framew

2009-08-18 11:08:24

.Net Framew

2010-01-06 10:23:47

.NET Framew

2010-03-10 11:00:26

Zend Studio远程调试

2009-07-16 15:02:33

Shapes命名空间Net Micro F

2024-02-23 10:33:34

SpringBean容器

2017-05-15 19:40:40

AndroidIPC机制

2013-03-28 09:07:37

Android开发Intent机制

2011-03-11 14:47:16

Zend Optimi优化

2009-05-26 09:09:50

.NET FramewStream.Read基础类

2009-07-22 17:07:16

WPF插件开发.NET Framew

2021-12-11 19:00:54

Java中断机制

2009-10-29 09:41:01

Linux内核DeviceMappe
点赞
收藏

51CTO技术栈公众号