Zend的Registry机制

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了。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,mixedindex,mixednewval ), 这个函数就是hashtable中的设置key,value,只是key,value可以是任何类型的。

 

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

set函数


1

2

3

4

5

6

public static function set($index, $value)

    {

        $instance = self::getInstance();

        $instance->offsetSet($index, $value);

 

    }

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

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

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class A{

    private $_instance;

    public static function getInstance(){

        ...

    }

     

    protected function __construct(){

        ...

    }

     

    public function setVal(){

        ...

    }

}

 

$a = A::getInstance();

 

$a->setVal();

 

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

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

A::setVal();

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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,然后实例化它

时间: 2024-12-02 09:34:43

Zend的Registry机制的相关文章

Zend的Registry机制的使用说明_php实例

项目过程中有很多全局变量, 需要全局存储,是否是使用全局变量来进行存储?那就弱爆了.Zend使用Registry机制(注册表)存储对象和值,是一个存储对象和值的容器. Zend_Registry这个类就是做这个目的 代码示例Zend_Registry::set('config', $config); Zend_Registry::get('config'); 代码分析这两个函数是最常用的两个函数.我们来看一下这个类 class Zend_Registry extends ArrayObject

Zend的Config机制

Zend的Config类在Zend_Config_Ini 代码 $config = new Zend_Config_Ini("/var/www/html/usvn/config/config.ini", "general"); date_default_timezone_set($config->timezone); USVN_ConsoleUtils::setLocale($config->system->locale); === Config.

基于Zend的Config机制的应用分析_php实例

Zend的Config类在Zend_Config_Ini 代码$config = new Zend_Config_Ini("/var/www/html/usvn/config/config.ini", "general"); date_default_timezone_set($config->timezone); USVN_ConsoleUtils::setLocale($config->system->locale); === Config.i

Zend的MVC机制(一)

代码   1 2 3 4 5 6 7 8 9 10 11 12 13 14 $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));   $front->setRequest(new USVN_Controller_Request_Http()); $front->throwExceptions(true); $front-&

Zend的AutoLoad机制

在使用zend framework的时候,最先引入的一定是AutoLoad的机制,这里就想分析下Zend的AutoLoad是怎么引入的.   代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());   require_once 'Zend/Loader/Autoloader.php';   $autoloader = Zend_Loader_A

Zend的MVC机制使用分析(一)_php实例

代码 复制代码 代码如下: $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR)); $front->setRequest(new USVN_Controller_Request_Http()); $front->throwExceptions(true); $front->setBaseUrl($config->

Zend的Captcha机制

如何生成验证码图片?使用php的GD? ok,right.其实Zend的Captcha模块已经封装好了.这篇文章就说一下如何使用Zend的Captcha模块.   环境安装 首先Zend的Captcha需要安装GD.查看有没有安装GD需要去phpinfo()中看是否有GD模块.(注意,有可能出现php -m里面的模块有gd但phpInfo()里面的模块没有gd,这个问题是说明你的PHP和Apache没有安装对.具体请去google之) (如果在安装gd的过程中提示Missing Dependen

Zend的MVC机制(二)

接着上面的一篇   把代码贴上来   1 2 3 4 5 6 7 8 9 10 11 12 13 14 $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR));   $front->setRequest(new Zend_Controller_Request_Http()); $front->throwExceptions(t

Zend的MVC机制使用分析(二)_php实例

接着上面的一篇 把代码贴上来 复制代码 代码如下: $front = Zend_Controller_Front::getInstance(); Zend_Layout::startMvc(array('layoutPath' => USVN_LAYOUTS_DIR)); $front->setRequest(new Zend_Controller_Request_Http()); $front->throwExceptions(true); $front->setBaseUrl(