开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

扩展单例

今天早上,我想知道如何扩展一个单例类,以便您可以在以后检索单例时检索新类。特别是,Zend_Controller_Front是一个单例,但如果我以后想扩展它怎么办?ZendFramework中的许多插件,特别是viewhelpers和路由功能,都使用了单例;以后我需要更改所有这些以便我可以使用新的子类吗?

例如,试试下面的代码:

class My_Controller_Front extends Zend_Controller_Front
{}

$front = My_Controller_Front::getInstance();

你会得到一个Zend_Controller_Front的实例。但是,如果您执行以下操作:

class My_Controller_Front extends Zend_Controller_Front
{
    protected static $_instance;

    public static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }
}

$front = My_Controller_Front::getInstance();

您现在将获得My_Controller_Front的一个实例。然而,由于$_instanceZend_Controller_Front中是私有的,调用Zend_Controller_Front::getInstance()仍然会返回一个Zend_Controller_Front实例——不好。

但是,如果我将Zend_Controller_Front::$_instance重新定义为protected,并且具有以下内容:

class My_Controller_Front extends Zend_Controller_Front
{
    public static function getInstance()
    {
        if (null === self::$_instance) {

            self::$_instance = new self();
        }

        return self::$_instance;
    }
}

$front = My_Controller_Front::getInstance();

然后每当我在My_Controller_FrontZend_Controller_Front上调用getInstance()时,我都会得到一个My_Controller_Front实例!

因此,要点是:如果您认为单例对象可以从扩展中获益,请将保存该实例的静态属性定义为受保护的,然后,在任何扩展类中,覆盖检索该实例的方法。

未经允许不得转载:我爱分享网 » 扩展单例

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏