Zend_Registry - 你需要getInstance()吗?

时间:2010-04-22 21:13:17

标签: zend-framework singleton registry

嘿,我想知道在应用程序中访问Zend_Registry时是否需要包含getInstance(),如果需要,为什么?

例如

    Zend_Registry::getInstance()->get('db');

VS

    Zend_Registry::get('db');
他们似乎都在使用后者,而不是那么冗长。 我模糊地理解Zend_Registry是一个单例,我认为这意味着它只能有一个实例?那你为什么需要getInstance()?

4 个答案:

答案 0 :(得分:6)

我在2007年为Zend_Registry编写了代码。

您可以使用静态get()set(),它会影响注册表的默认实例,存储为类的静态成员。这是大多数情况下的预期用途。

Zend_Registry的所有其他方法几乎都支持非典型情况,例如,如果您想为注册表实现自己的类,但仍然使其成为默认的单例。或者,如果您想获取实际的注册表对象,例如,您可以使用其所有内容序列化整个注册表对象。

答案 1 :(得分:2)

您不得使用getInstance()。 如果您查看Zend_Registry课程,您会看到:

  public static function get($index)
    {
        $instance = self::getInstance();

        if (!$instance->offsetExists($index)) {
            require_once 'Zend/Exception.php';
            throw new Zend_Exception("No entry is registered for key '$index'");
        }

        return $instance->offsetGet($index);
    }

它在静态方法中为您提供实例。

答案 2 :(得分:0)

不,您需要才能使用getInstance()。我相信,它存在于API的其他领域。在创建单例以暴露用于获取该单例实例的getInstance()方法时,这也是一种常见模式。因此,它被定义为坚持这种模式。

答案 3 :(得分:0)

如果要访问注册表的多个调用,可能需要使用Zend_Registry :: getInstance();而不是通过调用offsetExists()方法以及对每个属性的array_key_exists()的后续调用,您获得一个实例,然后通过ArrayObject方法获取存储的条目。

您可能想要使用Zend_Registry :: getInstance()的另一个原因是您将注册表存储在缓存中。

除此之外,您可能会发现Zend_Registry :: get()就是您所需要的一切。