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下通过POST还是GET来传值
Jun 05 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
Jul 09 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
php实现zip文件解压操作
Nov 03 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
浅析PHP开发规范
Feb 05 PHP
Yii2语言国际化的配置教程
Aug 19 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 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
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
PHP解决中文乱码
2017/04/28 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
党员志愿者活动方案
2014/08/28 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
小学生作文批改评语
2014/12/25 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript
Ajax实现三级联动效果
2021/10/05 Javascript