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