Zend的Registry机制的使用说明


Posted in PHP onMay 02, 2013

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了。Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器。

Zend_Registry这个类就是做这个目的

代码示例
Zend_Registry::set('config', $config);
Zend_Registry::get('config');

代码分析
这两个函数是最常用的两个函数。我们来看一下这个类

class Zend_Registry extends ArrayObject

这个类继承自ArrayObject

ArrayObject implements IteratorAggregate , Traversable , ArrayAccess , Serializable , Countable

ArrayObject是一个对象集合,相当于其他语言的泛型集合的概念。

重点了解下void ArrayObject::offsetSet ( mixed $index , mixed $newval ), 这个函数就是hashtable中的设置key,value,只是key,value可以是任何类型的。

好了,回到Zend_Registry, 看看set做了些什么事情

set函数

public static function set($index, $value) 
    { 
        $instance = self::getInstance(); 
        $instance->offsetSet($index, $value);     }

一个是实例化Register,另一个是调用offsetSet方法,将index和value设置进去。

offset方法很好理解,但是为什么要使用getInstance方法呢?

这里建议大家好好看看,这个是结合类静态方法的单例模式。

我们一般的单例模式写成:

class A{ 
    private $_instance; 
    public static function getInstance(){ 
        ... 
    }     protected function __construct(){ 
        ... 
    } 
    public function setVal(){ 
        ... 
    } 
} 
$a = A::getInstance(); 
$a->setVal();

这样在调用之前就需要实例化一个类,虽然这个实例化实际上是单例,但感觉还是不舒服

这边的register就做到了直接使用静态方法调用

A::setVal();

大致的代码思路我写了个demo

class A{ 
    private static $_instance; 
    public static function getInstance(){ 
        if(self::_instance !==null){ 
            return $this->_instance; 
        } else { 
            return new A(); 
        } 
    }     public function __construct(){ 
    } 
    public static function setV(){ 
        $a = self::getInstance(); 
        $a->setVal(); 
    } 
    public function setVal(){ 
        ... 
    } 
} 
A::setV();

实际上就是直接把__construct()放开成为public,然后实例化它
PHP 相关文章推荐
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
简单的php文件上传(实例)
Oct 27 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
php单一接口的实现方法
Jun 20 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
PHP实现一个简单url路由功能实例
Nov 05 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
php格式文件打开的四种方法
Feb 24 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 PHP
Zend的MVC机制使用分析(二)
May 02 #PHP
Zend的MVC机制使用分析(一)
May 02 #PHP
基于Zend的Captcha机制的应用
May 02 #PHP
PHP静态调用非静态方法的应用分析
May 02 #PHP
Mysql中分页查询的两个解决方法比较
May 02 #PHP
记录mysql性能查询过程的使用方法
May 02 #PHP
基于MySQL分区性能的详细介绍
May 02 #PHP
You might like
PHP实现下载功能的代码
2012/09/29 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python实现对象转换为xml的方法示例
2017/06/08 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
深入了解NumPy 高级索引
2020/07/24 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
存储过程和函数的区别
2013/05/28 面试题
介绍一下Linux中的链接
2016/05/28 面试题
面试后的感谢信范文
2014/02/01 职场文书
上班打牌检讨书
2014/02/07 职场文书
工作作风承诺书
2014/08/30 职场文书
2014教育局对照检查材料思想汇报
2014/09/23 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2016中秋节广告语
2016/01/28 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技