Zend Framework教程之Zend_Registry对象用法分析


Posted in PHP onMarch 22, 2016

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

使用对象注册表(Registry)

对象注册表(或称对象仓库)是一个用于在整个应用空间(application space)内存储对象和值的容器。通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象。这种机制相当于一种全局存储。

我们可以通过Zend_Registry类的静态方法来使用对象注册表,另外,由于该类是一个数组对象,你可以使用数组形式来访问其中的类方法。

1. 设置Registry中的值

要保存一项内容到注册表中,我们可以使用静态方法 set()。

例 1. set() 使用示例:

Zend_Registry::set('index', $value);

$value可以是一个对象、数组或者标量。你可以再次使用set()来为注册表中已有的值设置一个新值。

index参数可以是一个标量,即字符串或整数,就像使用数组一样,类似于数组的索引/键名。

2. 获取Registry中的值

可以使用 get()方法来获取Registry中某项内容的值。

例 2.  get() 方法示例:

$value = Zend_Registry::get('index');

getInstance()返回静态registry对象。
registry对象是可迭代的(iterable)。

例 3. 迭代一个registry对象:

$registry = Zend_Registry::getInstance();
foreach ($registry as $index => $value) {
  echo "Registry index $index contains:/n";
  var_dump($value);
}

3. 创建一个Registry对象

除了可以使用静态方法来访问Registry对象之外,你可以直接实例化它,就像使用普通的对象一样。

如果通过静态方法来访问registry对象的实例,它很方便进行静态存储,你可以在程序中的任何地方访问它。

如果使用传统的new 方法来创建registry的实例,则你可以使用数组一样的方式来初始化registry中的内容。

例 4. 创建一个registry对象

$registry = new Zend_Registry(array('index' => $value));

在创建这个对象实例之后,你可以使用数组对象方法来使用它,或者你可以把这个对象实例通过静态方法setInstance()设置为静态对象实例。

例 5. Example of initializing the static registry

$registry = new Zend_Registry(array('index' => $value));
Zend_Registry::setInstance($registry);

如果静态的注册表对象已经被初始化过,则setInstance()方法会抛出一个Zend_Exception异常。

4. 像访问数组一样访问Registry对象

如果你要一次访问或设置多个值,你会发现使用数组方式是很方便的。

例 6. array 方式访问示例:

$registry = Zend_Registry::getInstance();
$registry['index'] = $value;
var_dump( $registry['index'] );

5. 对象方式访问Registry

你会发现使用面向对象风格来访问registry对象也是方便的,对象中的属性名称作为索引。 要这样做,你需要使用ArrayObject::ARRAY_AS_PROPS选项来创建registry对象,并初始化静态实例。你要在静态的registry被第一次访问之前就完成这个工作。小心使用这个选项,因为某些版本的PHP在使用这个选项时会有bug。

例 7. 对象形式的访问:

//在你的bootstrap代码中:
$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
Zend_Registry::setInstance($registry);
$registry->tree = 'apple';
.
.
.
//在程序的任何其它地方:
$registry = Zend_Registry::getInstance();
echo $registry->tree; // echo's "apple"
$registry->index = $value;
var_dump($registry->index);

6. 查询一个索引是否存在

可以使用静态方法isRegistered()来查询是否某个特定的索引已经设置了相应的值。

例 8. isRegistered() 示例:

if (Zend_Registry::isRegistered($index)) {
  $value = Zend_Registry::get($index);
}

要确定一个数组对象中的某个特定索引的值是否设定,可以使用isset()函数,就像在普通的数组中那样使用。

例 9. isset() 示例:

$registry = Zend_Registry::getInstance();
// using array-access syntax
if (isset($registry['index'])) {
  var_dump( $registry['index'] );
}
// using object-access syntax, if enabled
if (isset($registry->index)) {
  var_dump( $registry->index );
}

7. 扩展Registry对象

静态registry对象是类Zend_Registry的一个实例。如果你想给它增加功能,你可以继承Zend_Registry类,然后指定使用这个类来访问对象注册表。你可以使用静态方法setClassName()来指定使用这个类。注意这个类一定要是Zend_Registry的子类。

例 10. 指定静态注册表的类名:

Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('index', $value);

如果你在registry已经被访问过后尝试设定该类名,则registry抛出一个异常。建议你在boostrap代码(即index.php)中设置该类名。

8. 删除静态注册表

尽管这不是必需的,你可以使用_unsetInstance()方法来删除registry的静态实例。

[注意] 数据丢失的风险

在使用_unsetInstance()的时候,静态注册表中的所有数据都会丢失并且无法恢复。

有时你可能需要_unsetInstance()这个方法。例如你想在已经初始化过registry对象之后,再使用setInstance()或 setClassName(),那么你可以使用_unsetInstance()先把静态实例删除了,然后才能使用那些方法。

例 11.  _unsetInstance() 示例:

Zend_Registry::set('index', $value);
Zend_Registry::_unsetInstance();
// 改变我们要使用的类
Zend_Registry::setClassName('My_Registry');
Zend_Registry::set('index', $value);

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
Jan 18 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
详细分析PHP 命名空间(namespace)
Jun 30 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 #PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 #PHP
Zend Framework框架路由机制代码分析
Mar 22 #PHP
PHP实现补齐关闭的HTML标签
Mar 22 #PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 #PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 #PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 #PHP
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python中的多重继承实例讲解
2014/09/28 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
.NET程序员的几道面试题
2012/06/01 面试题
聚美优品励志广告词
2014/03/14 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
2014年仓库工作总结
2014/11/20 职场文书
环境建议书
2015/02/04 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android