Zend framework Zend_注册表-需要getInstance()吗?

Zend framework Zend_注册表-需要getInstance()吗?,zend-framework,singleton,registry,Zend Framework,Singleton,Registry,嘿,我想知道在应用程序中访问Zend_注册表时是否需要包含getInstance(),如果需要,为什么 比如说 Zend_Registry::getInstance()->get('db'); vs 他们两人似乎都在工作,而后者则不那么冗长。 我模糊地理解Zend_注册表是一个单例,我想这意味着它只能有一个实例?那么为什么需要getInstance() 不,您不需要使用getInstance()。我相信,API的其他领域也会用到它。在创建singleton以公开用于获取该singleto

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

比如说

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

他们两人似乎都在工作,而后者则不那么冗长。
我模糊地理解Zend_注册表是一个单例,我想这意味着它只能有一个实例?那么为什么需要getInstance()

不,您不需要使用
getInstance()
。我相信,API的其他领域也会用到它。在创建singleton以公开用于获取该singleton实例的
getInstance()
方法时,这也是一种常见的模式。因此,它被定义为遵循该模式。

您不必使用
getInstance()
。 如果您查看
Zend_注册表
类,您将看到:

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

它在静态方法中为您获取实例。

如果您希望访问大量对注册表的调用,您可能希望使用Zend_Registry::getInstance();对于每个属性,不需要执行对offsetExists()方法的调用和对array_key_exists()的后续调用,而是获取一个实例,然后通过ArrayObject方法获取存储的条目

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


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

我在2007年为Zend_Registry编写了代码

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

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