今天早上,我想知道如何扩展一个单例类,以便您可以在以后检索单例时检索新类。特别是,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的一个实例。然而,由于$_instance在Zend_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_Front或Zend_Controller_Front上调用getInstance()时,我都会得到一个My_Controller_Front实例!
因此,要点是:如果您认为单例对象可以从扩展中获益,请将保存该实例的静态属性定义为受保护的,然后,在任何扩展类中,覆盖检索该实例的方法。
