Zend Framework教程之Autoloading用法详解


Posted in PHP onMarch 08, 2016

本文实例讲述了Zend Framework教程之Autoloading用法。分享给大家供大家参考,具体如下:

一、概述

自动加载是一种机制,无需依赖手动编写PHP代码。参考»PHP手册自动加载,一旦自动加载器被定义,你试图使用一个没有定义的类或接口的情况下,它会自动被调用。

使用自动加载,在项目中你不必担心类的存放位置。定义一个良好定义的自动加载器,您不需要考虑一个类文件相对于当前类文件的位置,您只需使用类,自动加载器将自动查找文件。

此外,自动加载,确保只加载一次,提升了性能 -所以可以用它替代require_once()。

Zend Framework 鼓励使用自动加载,并提供了许多工具实现自动加载代码库以及应用程序代码。下面将介绍这些工具,以及如何有效地使用它们。

自动加载的实现约定

类命名约定

Zend Framework借鉴了 PEAR的想法,即类名与文件系统的1:1的关系。简单地说,下划线字符("_")替换目录分隔,以代表该文件的路径,然后添加后缀“.php”。例如,类“Foo_Bar_Baz”将对应文件系统上的"Foo/Bar/Baz.php"。假设已通过PHP的include_path设置类的位置,这使得可以通过 include() 和 require()找到相对include_path中设置的路径查找文件名。

此外,推荐使用供应商名称或项目名称作为前缀。这意味着,你写的所有的类都有一个共同的类前缀,例如,Zend Framework的所有代码前缀为“Zend_”。这种命名约定有助于防止命名冲突。在ZendFramework中,我们经常提到“namespace”前缀,要注意不要把它与PHP的本地命名空间混淆。

自动加载器设计约定

Zend Framework通过Zend_Loader_Autoloader实现支持自动加载的,主要提供有以下目标和设计元素:

提供命名空间匹配。如果类的命名空间前缀是没有注册的命名空间,会返回FALSE。

允许定义自动加载器作为一个备用的自动加载器。一个团队可能分布广泛,或使用一个为定义的命名空间前缀情况下,它会尝试匹配任何命名空间前缀。但是,这种做法是不推荐,因为它可能会导致不必要的查找。
允许开启禁止错误提示。 因此,默认情况下,它应该处于关闭状态。开发阶段,可以启用它。

可以自定义自动加载。一些开发商不希望使用Zend_Loader::loadClass()自动加载,但仍想使用Zend Framework的自动加载机制。 Zend_Loader_Autoloader允许使用自定义的自动加载。

允许使用SPL自动加载回调链。这样做的目的是允许指定额外的自动加载器 。

二、用法:

通常,只需将需要引入包含类,然后实例化它即可。由于Zend_Loader_Autoloader采用的单例模式,可以使用getInstance()方法来获取一个实例。

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

默认情况下,可以加载命名空间前缀为"Zend_"或 "ZendX_"的任何类,只要确保已经指定include_path。
如果想使用其他的命名空间前缀?最好的,最简单的方法是调用registerNamespace() 方法。您可以通过传递一个单一的命名空间前缀,或一个数组:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Foo_');
$loader->registerNamespace(array('Foo_', 'Bar_'));

或者,你可以把Zend_Loader_Autoloader作为一个“备用”自动加载器。这意味着如果命名空间无论是否定义,都会尝试自动加载。

$loader->setFallbackAutoloader(true);

(注意:这种方式是不推荐的,尽量不要使用)。

Zend_Loader_Autoloader的内部实现是使用 Zend_Loader::loadClass() 加载类的。该方法的使用 include() 来尝试加载给定的类文件。 include()将返回一个布尔值,如果没有成功返回FALSE - ​​而且还发出PHP警告。 可能会导致以下问题:

如果启用了display_errors,警告将包含在输出中。

根据你所配置的error_reporting级别,它也可以输出到日志中。
可以禁止这些错误消息,具体如下:(但注意,display_errors启用时,错误日志将始终显示。)

$autoloader->suppressNotFoundWarnings(true);

选择一个Zend Framework的版本

ZendFramework/
|-- 1.9.2/
|   |-- library/
|-- ZendFramework-1.9.1-minimal/
|   |-- library/
|-- 1.8.4PL1/
|   |-- library/
|-- 1.8.4/
|   |-- library/
|-- ZendFramework-1.8.3/
|   |-- library/
|-- 1.7.8/
|   |-- library/
|-- 1.7.7/
|   |-- library/
|-- 1.7.6/
|   |-- library/

$autoloader->setZfPath($path, 'latest');
$autoloader->setZfPath($path, '1.8');
$autoloader->setZfPath($path, '1.7.7');

也可以使用配置文件

[production]
autoloaderZfPath = "path/to/ZendFramework"
autoloaderZfVersion = "1.7.7"
[qa]
autoloaderZfVersion = "1.8"
[development]
autoloaderZfVersion = "latest"

Autoloader接口

注:命名空间前缀和PHP命名空间

PHP5.3已经发布。该版本中,PHP现在已经正式支持命名空间。

然而,Zend Framework的命名空间和PHP 5.3的命名空间完全不同的。 Zend Framework中,提到的“命名空间”,是指一个类前缀。例如,所有的Zend Framework的类名称的前缀“Zend_”。 这是我们指定的“命名空间”。

在Zend Framework 2.0.0使用了原生的PHP命名空间。

自动加载器除了能够指定任意回调以外,Zend Framework还定义了一个需要自动加载类实现的接口Zend_Loader_Autoloader_Interface:

interface Zend_Loader_Autoloader_Interface
{
  public function autoload($class);
}

如果您希望在Zend Framework中使用自定义的自动加载器,可以使用 Zend_Loader_Autoloader的 pushAutoloader()和unshiftAutoloader()方法。
通过这些方法将在Zend Framework的内部自动装载器之后追加或之前使用自定义的加载器。

每个方法接受一个可选的第二个参数,类的命名空间前缀。自动加载器只查找给定的类前缀。如果不是指定的类前缀,将跳过自动加载器 , 这可能是一种性能改进方式。

当使用这个接口时,你需要传递类实例到Zend_Loader_Autoloader类的pushAutoloader()和unshiftAutoloader()方法,具体如下:

// Append function 'my_autoloader' to the stack,
// to manage classes with the prefix 'My_':
$loader->pushAutoloader('my_autoloader', 'My_');
// Prepend static method Foo_Loader::autoload() to the stack,
// to manage classes with the prefix 'Foo_':
$loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
// Assume Foo_Autoloader implements Zend_Loader_Autoloader_Interface:
$foo = new Foo_Autoloader();
$autoloader->pushAutoloader($foo, 'Foo_');

Zend_Loader_Autoloader的相关方法

Method Return Value Parameters Description
getInstance() Zend_Loader_Autoloader N/A 获取实例
resetInstance() void N/A 重置Zend_Loader_Autoloadersingleton实例的状态,恢复它的原始状态,注销所有的自动加载器回调和所有注册的命名空间。
autoload($class) string|FALSE $class,required. A string class name to load. 试图加载一个类。
setDefaultAutoloader($callback) Zend_Loader_Autoloader $callback,required. 指定默认的加载器回调
getDefaultAutoloader() callback N/A 获取默认的加载器接口;默认是Zend_Loader::loadClass().
setAutoloaders(array $autoloaders) Zend_Loader_Autoloader $autoloaders,required. 设置在自动加载器栈使用具体的自动加载器列表。自动加载器列表中的每个项目必须是PHPcallback。
getAutoloaders() Array N/A  
getNamespaceAutoloaders($namespace) Array $namespace,required 获取所有已注册的自动加载器来加载一个特定的的命名空间。
registerNamespace($namespace) Zend_Loader_Autoloader $namespace,required. 注册命名空间. If$namespace is a string, it registers that namespace; if it's an array of strings, registers each as a namespace.
unregisterNamespace($namespace) Zend_Loader_Autoloader $namespace,required.
getRegisteredNamespaces() Array N/A
suppressNotFoundWarnings($flag = null) boolean|Zend_Loader_Autoloader $flag,optional. 错误提示
setFallbackAutoloader($flag) Zend_Loader_Autoloader $flag,required.  
isFallbackAutoloader() Boolean N/A  
getClassAutoloaders($class) Array $class,required.  
unshiftAutoloader($callback, $namespace = '') Zend_Loader_Autoloader $callback,required. A valid PHPcallback $namespace,optional. A string representing a class prefix namespace.  
pushAutoloader($callback, $namespace = '') Zend_Loader_Autoloader $callback,required. A valid PHPcallback $namespace,optional. A string representing a class prefix namespace.  
removeAutoloader($callback, $namespace = '') Zend_Loader_Autoloader $callback,required. A valid PHPcallback $namespace,optional. A string representing a class prefix namespace, or an array of namespace strings.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php5数字型字符串加解密代码
Apr 24 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
ThinkPHP控制器详解
Jul 27 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
Nov 15 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
Mar 27 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 #PHP
php bootstrap实现简单登录
Mar 08 #PHP
PHP Echo字符串的连接格式
Mar 07 #PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 #PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 #PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 #PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 #PHP
You might like
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
取选中的radio的值
2010/01/11 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
jquery中each循环的简单回滚操作
2017/05/05 jQuery
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
2017/06/16 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
python实现socket端口重定向示例
2014/02/10 Python
Python中的字符串类型基本知识学习教程
2016/02/04 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python requests post多层字典的方法
2018/12/27 Python
Python地图绘制实操详解
2019/03/04 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
单位实习证明怎么写
2014/01/17 职场文书
推普周活动总结
2014/08/28 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
解析Redis Cluster原理
2021/06/21 Redis
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers