43.1. 使用对象注册表(Registry)

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

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

43.1.1. 设置Registry中的值

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

例 43.1. set() 使用示例:

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

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

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

43.1.2. 获取Registry中的值

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

例 43.2.  get() 方法示例:

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

getInstance()返回静态registry对象。

registry对象是可迭代的(iterable)。

例 43.3. 迭代一个registry对象:

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

43.1.3. 创建一个Registry对象

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

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

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

例 43.4. 创建一个registry对象

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

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

例 43.5. Example of initializing the static registry

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

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

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

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

例 43.6. array 方式访问示例:

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

43.1.5. 对象方式访问Registry

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

例 43.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);

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

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

例 43.8. isRegistered() 示例:

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

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

例 43.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 ); }

43.1.7. 扩展Registry对象

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

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

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

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

43.1.8. 删除静态注册表

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

数据丢失的风险

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

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

例 43.11.  _unsetInstance() 示例:

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

Zend_Registry相关推荐

  1. 对象注册表 Zend_Registry

    使用Zend_Registry可以轻松的设置全局变量 可以使用实例化的方式来创建对象 $array = array('name'=>'Danny',age=>'99'); $registr ...

  2. php 查看init,php 中init log

    1.修改 Bootstrap.php,在其中加入_initLog()函数. protectedfunction_initLog(){$log=$this->getOption('log');$c ...

  3. python定时器每月执行一次_python 定时器,实现每天凌晨3点执行的方法

    python 定时器,实现每天凌晨3点执行的方法 如下所示: ''' Created on 2018-4-20 例子:每天凌晨3点执行func方法 ''' import datetime import ...

  4. 最新zendframework1.11使用

    1.下载zf最新版Zend Framework- Downloads- Downloads 2.首先进入cmd,命令行窗口模式. 直接打下面的命令, C:\Documents and Settings ...

  5. PHP CGI 中 fix_pathinfo 引起的安全隐患

    这两天网上开始疯传一个"nginx文件类型错误解析漏洞",这个"漏洞"是这样的: 假设有如下的 URL:http://phpvim.net/foo.jpg,当访 ...

  6. mysql面试100题及答案_PHP面试100题汇总

    PHP面试100题汇总 1,Http 和Https的区别 第一:http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议 第二:http和https使用的是完全不同的连接方 ...

  7. zend 修改默认view路径,添加扩展view

    2019独角兽企业重金招聘Python工程师标准>>> 在bootstrap.php内添加 protected function _initView() { $view = new ...

  8. zend framework1.12 没找到php.exe,请加一个zend framework的有关问题

    请加一个zend framework的问题 我在用phpunit测试zend项目里的model, 这个model是这样的: PHP codeclass Application_Model_AdminG ...

  9. bootstrap php zend,Zend Framework教程之Bootstrap类用法概述

    本文实例讲述了Zend Framework中Bootstrap类用法.分享给大家供大家参考,具体如下: Zend_Application_Bootstrap_Bootstrapper Zend_App ...

最新文章

  1. python中函数包括标准库函数吗_Python语言和标准库(第二章:函数)
  2. Struts2框架--学习笔记(下):OGNL表达式、值栈操作、拦截器、struts2标签、文件上传
  3. SAP Fiori internationalization(国际化)实现的一些例子
  4. 装饰器补充、三元表达式、生成式、匿名函数
  5. 通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 1
  6. Ubuntu18.04-albert编译安装记录
  7. AWS SQS, SWF and SNS
  8. Mac下无法拷贝文件到移动硬盘
  9. 使用android studio设置签名信息
  10. 腾讯校招智力题-赛马问题-毒药与老鼠
  11. 信息系统安全等级保护流程
  12. 【青少年编程】【二级】小瓢虫找妈妈
  13. Jpeg文件格式转换成bmp文件格式
  14. MySQL数据库——MySQL是什么?它有什么优势?
  15. Nature reviews Neurology:癫痫合并神经行为障碍:基于网络的精确分类
  16. app下载统计 php,如何统计app在各个渠道的下载量?
  17. 2021年PHP最新面试题(一)
  18. 手机电池电量剩余通知
  19. 动画解析:图的遍历方式有哪些?
  20. Android项目之视频播放器

热门文章

  1. 免费内网穿透方案——ZeroTier+OpenWRT
  2. php代码文字中怎么换行符,PHP如何使用换行符?(代码示例)
  3. MySql数据库允许外网访问连接
  4. Mycat之——实现MySQL垂直分库
  5. 选择排序 冒泡 java_排序扯淡:冒泡、选择、插入(Java)
  6. RT Thread之ADC电压读取
  7. idea热部署与重启
  8. 人工智能方面有什么创业项目_人工智能创业项目方案(未来人工智能最挣钱的方向)...
  9. matlab rdk,rtklib_2.4.2_p3 gps导航定位算法,有最先进的rtk matlab 238万源代码下载- www.pudn.com...
  10. 通过JLINK给CC1310烧录程序