Zend的AutoLoad机制

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

 

代码示例


1

2

3

4

5

6

7

8

9

10

11

12

13

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=callback=this->getDefaultAutoloader();

这里会获取默认的Autoloader,什么是默认的Autoloader? 看这个类初始定义,实际上是array('Zend_Loader', 'loadClass');

下面自然就调用的是call_user_func(callback,callback,class);即Zend_Loader:loadClass("USVN_Config_Ini")

 

首先Zend_Loader已经在AutoLoader.php中被require了

其次我们看看Zend_Loader:loadClass方法,这个方法第一步是检查异常,跳过。第二步是将类分隔,拼凑成file,比如USVN/Config/Ini.php,下面就直接调用self::loadFile(file,比如USVN/Config/Ini.php,下面就直接调用self::loadFile(file, null, true);

 

接下来查看self::loadFile,

首先_securityCheck看类名中是否有非法字符,没有,就include了这个file。这里的file。这里的file当然是相对路径,需要拼接上include_path, 记得include_path是在哪里设置的吗?在程序的一开始就设置了!好了,这里就把USVN_Config_Ini这个类读取进来了。

看到这里你就该明白了,如果你自己定义了一个类,并且注册了Namespace,比如USVN,那么你就应该在include_path下面创建一个同名文件夹(大小写必须区分),然后你要引入的相对的文件路径名就是以类名的_做分隔读入的。

 

到这里AutoLoad机制就阅读完了。

时间: 2024-09-12 03:38:27

Zend的AutoLoad机制的相关文章

PHP autoload 机制详解_Android

PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中--相信这个文件一定会非常大.但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件. 1. autoload 机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用

PHP autoload 机制详解

PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中--相信这个文件一定会非常大.但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件. 1. autoload 机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用

php自动加载autoload机制示例分享

 这篇文章主要介绍了php自动加载autoload机制示例,文件结构如下,2种方式实现自动加载,需要的朋友可以参考下 1,自定义函数   2,spl_autoload_register()    代码如下: liuyuan@ebuinfo:/var/www/phpgcs/php_autoload$ ll ./* -rw-rw-r-- 1 liuyuan liuyuan  800 Feb 19 11:39 ./func_autoload.php -rw-rw-r-- 1 liuyuan liuyu

Zend的Config机制

Zend的Config类在Zend_Config_Ini 代码 $config = new Zend_Config_Ini("/var/www/html/usvn/config/config.ini", "general"); date_default_timezone_set($config->timezone); USVN_ConsoleUtils::setLocale($config->system->locale); === Config.

Zend的Registry机制

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了.Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器. Zend_Registry这个类就是做这个目的 代码示例 Zend_Registry::set('config', $config);  Zend_Registry::get('config');   代码分析 这两个函数是最常用的两个函数.我们来看一下这个类 class Zend_Registry extends ArrayOb

Zend的Registry机制的使用说明_php实例

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了.Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器. Zend_Registry这个类就是做这个目的 代码示例Zend_Registry::set('config', $config); Zend_Registry::get('config'); 代码分析这两个函数是最常用的两个函数.我们来看一下这个类 class Zend_Registry extends ArrayObject

基于Zend的Config机制的应用分析_php实例

Zend的Config类在Zend_Config_Ini 代码$config = new Zend_Config_Ini("/var/www/html/usvn/config/config.ini", "general"); date_default_timezone_set($config->timezone); USVN_ConsoleUtils::setLocale($config->system->locale); === Config.i

深入PHP autoload机制的详解_php技巧

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便 利.这 也是OO设计的基本思想之一.在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.下面是一个实际的例 子: 复制代码 代码如下: /* Person.class.php */<?phpclass Person {var $name, $age; function __construct ($name, $a

Zend的Captcha机制

如何生成验证码图片?使用php的GD? ok,right.其实Zend的Captcha模块已经封装好了.这篇文章就说一下如何使用Zend的Captcha模块.   环境安装 首先Zend的Captcha需要安装GD.查看有没有安装GD需要去phpinfo()中看是否有GD模块.(注意,有可能出现php -m里面的模块有gd但phpInfo()里面的模块没有gd,这个问题是说明你的PHP和Apache没有安装对.具体请去google之) (如果在安装gd的过程中提示Missing Dependen