使用对象注册表(Registry)对象注册表(或称对象仓库)是一个用于在整个应用空间(application space)内存储对象和值的容器。通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象。这种机制相当于一种全局存储。 我们可以通过Zend_Registry类的静态方法来使用对象注册表,另外,由于该类是一个数组对象,你可以使用数组形式来访问其中的类方法。 设置Registry中的值
要保存一项内容到注册表中,我们可以使用静态方法 Example #1 set() 使用示例: Zend_Registry::set('index', $value);
$value可以是一个对象、数组或者标量。你可以再次使用 index参数可以是一个标量,即字符串或整数,就像使用数组一样,类似于数组的索引/键名。 获取Registry中的值
可以使用 Example #2 get() 方法示例: $value = Zend_Registry::get('index');
registry对象是可迭代的(iterable)。 Example #3 迭代一个registry对象: $registry = Zend_Registry::getInstance(); foreach ($registry as $index => $value) { echo "Registry index $index contains:\n"; var_dump($value); } 创建一个Registry对象除了可以使用静态方法来访问Registry对象之外,你可以直接实例化它,就像使用普通的对象一样。 如果通过静态方法来访问registry对象的实例,它很方便进行静态存储,你可以在程序中的任何地方访问它。
如果使用传统的 Example #4 创建一个registry对象 $registry = new Zend_Registry(array('index' => $value));
在创建这个对象实例之后,你可以使用数组对象方法来使用它,或者你可以把这个对象实例通过静态方法 Example #5 Example of initializing the static registry $registry = new Zend_Registry(array('index' => $value)); Zend_Registry::setInstance($registry);
如果静态的注册表对象已经被初始化过,则 像访问数组一样访问Registry对象如果你要一次访问或设置多个值,你会发现使用数组方式是很方便的。 Example #6 array 方式访问示例: $registry = Zend_Registry::getInstance(); $registry['index'] = $value; var_dump( $registry['index'] ); 对象方式访问Registry
你会发现使用面向对象风格来访问registry对象也是方便的,对象中的属性名称作为索引。
要这样做,你需要使用 Example #7 对象形式的访问: //在你的bootstrap代码中: $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS) Zend_Registry::setInstance($registry); $registry->tree = 'apple'; . . . //在程序的任何其它地方: $registry = Zend_Registry::getInstance(); echo $registry->tree; // echo's "apple" $registry->index = $value; var_dump($registry->index); 查询一个索引是否存在
可以使用静态方法 Example #8 isRegistered() 示例: if (Zend_Registry::isRegistered($index)) { $value = Zend_Registry::get($index); } 要确定一个数组对象中的某个特定索引的值是否设定,可以使用isset()函数,就像在普通的数组中那样使用。 Example #9 isset() 示例: $registry = Zend_Registry::getInstance(); // using array-access syntax if (isset($registry['index'])) { var_dump( $registry['index'] ); } // using object-access syntax, if enabled if (isset($registry->index)) { var_dump( $registry->index ); } 扩展Registry对象
静态registry对象是类Zend_Registry的一个实例。如果你想给它增加功能,你可以继承Zend_Registry类,然后指定使用这个类来访问对象注册表。你可以使用静态方法 Example #10 指定静态注册表的类名: Zend_Registry::setClassName('My_Registry'); Zend_Registry::set('index', $value); 如果你在registry已经被访问过后尝试设定该类名,则registry抛出一个异常。建议你在boostrap代码(即index.php)中设置该类名。 删除静态注册表
尽管这不是必需的,你可以使用
有时你可能需要 Example #11 _unsetInstance() 示例: Zend_Registry::set('index', $value); Zend_Registry::_unsetInstance(); // 改变我们要使用的类 Zend_Registry::setClassName('My_Registry'); Zend_Registry::set('index', $value);
|