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

目录
相关文章
|
4月前
|
安全 测试技术 微服务
【Azure 微服务】Service Fabric, 使用ARM Template方式来更新SF集群的证书(Renew SF Certificate)
【Azure 微服务】Service Fabric, 使用ARM Template方式来更新SF集群的证书(Renew SF Certificate)
|
4月前
|
应用服务中间件 Linux API
Linux 利用 Cloudflare API 配置 acme.sh 自动续签 SSL (Apache、Nginx适用)
安装acme.sh工具,命令为`curl https://get.acme.sh | sh -s email=你的邮箱`。接着配置Cloudflare API,创建并记录API令牌及Zone ID。最后通过`acme.sh --issue -d 你的域名 --dns dns_cf`签发SSL证书,对于Nginx可使用`acme.sh --install-cert`命令安装证书,并设置自动重载Nginx服务。
|
6月前
|
Apache
apisix~14在自定义插件中调用proxy_rewrite
在 Apache APISIX 中,通过 proxy-rewrite 插件来修改上游配置时,需要确保插件的执行顺序和上下文环境正确。你提到在自己的插件中调用 proxy_rewrite.rewrite({host="new_upstream"}, ctx),但新上游没有生效,这可能是由于以下几个原因: 1. 插件执行顺序:确保你的自定义插件在 proxy-rewrite 插件之后执行,proxy-rewrite.priority是1008。
|
7月前
|
Linux 网络安全 Python
解决方案:Centos7运行Django项目报错no module named _ssl
解决方案:Centos7运行Django项目报错no module named _ssl
174 0
|
缓存 应用服务中间件 nginx
Nginx Proxy Cache原理和最佳实践(上)
Nginx Proxy Cache原理和最佳实践
450 0
Nginx Proxy Cache原理和最佳实践(上)
|
应用服务中间件 nginx C语言
【Nginx报错处理方案】ivalid c++ compiler or c++ compiler flags
【Nginx报错处理方案】ivalid c++ compiler or c++ compiler flags
383 0
|
存储 缓存 搜索推荐
Nginx Proxy Cache原理和最佳实践(下)
Nginx Proxy Cache原理和最佳实践
698 0
|
Kubernetes 容器 Perl
Kubernetes的Device Plugin机制源码解析(1)
Kubernetes 1.8 引入的Device Plugin机制,通过扩展的方式实现支持GPU、FPGA、高性能 NIC、InfiniBand等各种设备的集成。而Device Manager正是Kubelet内负责Device Plugin交互和设备生命周期管理的模块,在了解其基本设计后,本文对Device Manager的源码分析,理解其运作方式。
3908 0