Zend Framework1-Zend_Registry

Zend_Registry

注册者模式 (registry) 提供了在程序中有条理的存放并管理对象 (object)一种解决方案 ,它的主要作用是防止用户滥用全局对象 (global object) 。

滥用全局对象可能会导致对象可见性混乱、安全性受到威胁等问题。而使用注册者模式也是实现依赖注入思想的一个类型示例。

Zend Framework的Zend_Registry组件提供了唯一的存、取、销毁对象的方法。是注册者模式的经典案例。

Zend_Registry组件的实 现非常简单,只有一个文件(Registry.php)。

Zend_Registry继承自ArrayObject类,ArrayObject类属于 SPL(Standard PHP Library -> PHP标准库)一部分。

Zend_Registry类继承了ArrayObject类后就让存储其中的对象有了像数组一样工作的能力。

代码 Zend_Registry::set('log',$logger); 实际上就是调用了offsetSet方法来存储了我们的全局对象$logger。

代码Zend_Registry::get('log');就调用了offsetGet方法。对象的以数组访问的能力和存储的具体实现都是由ArrayObject类完成的。

我们使用Zend_Registry组件就很好的管理了全局对象,为全局对象的存取传递提供了一个临时空间,这样就避免了在需要时创建某个对象或干脆就硬编码对象到变量;从而保证了应用的灵活性。这也是依赖注入思想的一个解决方案。


使用对象注册表(Registry)

对象注册表(或称对象仓库)是一个用于在整个应用空间(application space)内存储对象和值的容器。通过把对象存储在其中,我们可以在整个项目的任何地方使用同一个对象。这种机制相当于一种全局存储。

我们可以通过Zend_Registry类的静态方法来使用对象注册表,另外,由于该类是一个数组对象,你可以使用数组形式来访问其中的类方法。


1. 设置Registry中的值

要保存一项内容到注册表中,我们可以使用静态方法 set()。

例1. set() 使用示例:

Zend_Registry::set('index', $value);

$value可以是一个对象、数组或者标量。你可以再次使用set()来为注册表中已有的值设置一个新值。

index参数可以是一个标量,即字符串或整数,就像使用数组一样,类似于数组的索引/键名。


2. 获取Registry中的值

可以使用get()方法来获取Registry中某项内容的值。

例2.  get() 方法示例:

$value = Zend_Registry::get('index');

getInstance()返回静态registry对象。


registry对象是可迭代的(iterable)。

例3. 迭代一个registry对象:

$registry = Zend_Registry::getInstance();

foreach ($registry as $index => $value) {

    echo "Registry index $index contains:/n"; var_dump($value);

}


3. 创建一个Registry对象

除了可以使用静态方法来访问Registry对象之外,你可以直接实例化它,就像使用普通的对象一样。

如果通过静态方法来访问registry对象的实例,它很方便进行静态存储,你可以在程序中的任何地方访问它。

如果使用传统的new 方法来创建registry的实例,则你可以使用数组一样的方式来初始化registry中的内容。

例4. 创建一个registry对象

$registry = new Zend_Registry(array('index' => $value));

在创建这个对象实例之后,你可以使用数组对象方法来使用它,或者你可以把这个对象实例通过静态方法setInstance()设置为静态对象实例。

例5. Example of initializing the static registry

$registry = new Zend_Registry(array('index' => $value));

Zend_Registry::setInstance($registry);

如果静态的注册表对象已经被初始化过,则setInstance()方法会抛出一个Zend_Exception异常。


4. 像访问数组一样访问Registry对象

如果你要一次访问或设置多个值,你会发现使用数组方式是很方便的。

例6. array 方式访问示例:

$registry = Zend_Registry::getInstance();

$registry['index'] = $value;

var_dump( $registry['index'] );


5. 对象方式访问Registry

你会发现使用面向对象风格来访问registry对象也是方便的,对象中的属性名称作为索引。

要这样做,你需要使用ArrayObject::ARRAY_AS_PROPS选项来创建registry对象,并初始化静态实例。

你要在静态的registry被第一次访问之前就完成这个工作。小心使用这个选项,因为某些版本的PHP在使用这个选项时会有bug。

例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);


6. 查询一个索引是否存在

可以使用静态方法isRegistered()来查询是否某个特定的索引已经设置了相应的值。

例8. isRegistered() 示例:

if (Zend_Registry::isRegistered($index)) {

    $value = Zend_Registry::get($index);

}

要确定一个数组对象中的某个特定索引的值是否设定,可以使用isset()函数,就像在普通的数组中那样使用。

例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 );

}


7. 扩展Registry对象

静态registry对象是类Zend_Registry的一个实例。如果你想给它增加功能,你可以继承Zend_Registry类,然后指定使用这个类来访问对象注册表。

你可以使用静态方法setClassName()来指定使用这个类。注意这个类一定要是Zend_Registry的子类。

例10. 指定静态注册表的类名:

Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);

如果你在registry已经被访问过后尝试设定该类名,则registry抛出一个异常。

建议你在boostrap代码(即index.php)中设置该类名。


8. 删除静态注册表

尽管这不是必需的,你可以使用_unsetInstance()方法来删除registry的静态实例。[注意]     数据丢失的风险

在使用_unsetInstance()的时候,静态注册表中的所有数据都会丢失并且无法恢复。

有时你可能需要_unsetInstance()这个方法。例如你想在已经初始化过registry对象之后,再使用setInstance()或 setClassName(),那么你可以使用_unsetInstance()先把静态实例删除了,然后才能使用那些方法。

例11.  _unsetInstance() 示例:

Zend_Registry::set('index', $value);

Zend_Registry::_unsetInstance();

// 改变我们要使用的类

Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);


###############################################################################################


在不同的文件中使用Zend_Registry

注册过的Zend_Registry可以在文件的任何位置使用

在我的工程里:

index.php中:

$registry=Zend_Registry::getInstance();

$registry->set('admin',$admin_i);

其中$admin_i是一个数组


在某个controllers文件的Action方法中:

$registry=Zend_Registry::getInstance();

$admin=$registry->get('admin');

if($username1==$admin['user']&&$password1==$admin['pass'])

{
       //创建会话,保存登录信息
       session_unset();//删除会话
       session_destroy();
       session_register("password");//创建会话变量,保存密码
       $HTTP_SESSION_VARS["passowrd"]=$password1;
       session_register("username");//保存用户名
       $HTTP_SESSION_VARS["username"]=$username1;
       //发送cookie到客户端,密码被加密
       if($remember=="1")
       {
            setcookie("remembercookieusername",$username1,(time()+604800));
        setcookie("remembercookiepassword",md5($password1),(time()+604800));
       }   
        //登录成功,页面转到管理页面
       $this->view->logingoto="index";

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值