项目过程中有很多全局变量, 需(本文来源gaodai#ma#com搞@@代~&码网
搞代gaodaima码
要全局存储,是否是使用全局变量来进行存储?那就弱爆了。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) <BR> { <BR> $instance = self::getInstance(); <BR> $instance->offsetSet($index, $value); <br><br> } </P><P>
一个是实例化Register,另一个是调用offsetSet方法,将index和value设置进去。
offset方法很好理解,但是为什么要使用getInstance方法呢?
这里建议大家好好看看,这个是结合类静态方法的单例模式。
我们一般的单例模式写成:
class A{ <BR> private $_instance; <BR> public static function getInstance(){ <BR> ... <BR> } <br><br> protected function __construct(){ <BR> ... <BR> } <br><br> public function setVal(){ <BR> ... <BR> } <BR>} <br><br>$a = A::getInstance(); <br><br>$a->setVal();<BR>
这样在调用之前就需要实例化一个类,虽然这个实例化实际上是单例,但感觉还是不舒服
这边的register就做到了直接使用静态方法调用
A::setVal();
大致的代码思路我写了个demo
class A{ <BR> private static $_instance; <BR> public static function getInstance(){ <BR> if(self::_instance !==null){ <BR> return $this->_instance; <BR> } else { <BR> return new A(); <BR> } <BR> } <br><br> public function __construct(){ <br><br> } <br><br> public static function setV(){ <BR> $a = self::getInstance(); <BR> $a->setVal(); <BR> } <br><br> public function setVal(){ <BR> ... <BR> } <BR>} <br><br>A::setV();<BR>
实际上就是直接把__construct()放开成为public,然后实例化它