欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Zend的Registry机制的使用说明

程序员文章站 2022-05-31 18:10:15
项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了。zend使用registry机制(注册表)存储对象和值,是一个存储对象和值的容器。 z...

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了。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,然后实例化它