我正在为PHP应用程序编写一些实用程序类,其中很多都是单例。发现自己一遍又一遍地重写相同的代码,并决定创建一个抽象基类Singleton
并将其子类化。只是想确保我已经正确完成了这个!
abstract class Singleton
{
private static $instance = NULL;
public static final function getInstance()
{
if(self::$instance == NULL)
self::$instance = instantiate();
return self::$instance;
}
protected abstract static function instantiate();
}
class LogHelper extends Singleton
{
protected static final function instantiate()
{
return new LogHelper();
}
}
现在,如果我已正确完成此操作,我可以从代码库中的任何位置调用LogHelper $LOGGER = LogHelper::getInstance()
,并且每次都获得对同一实例的引用,是吗?
答案 0 :(得分:2)
您可能需要将getInstance()方法定义为static,以便可以在不必实例化类的情况下访问它们。然后,你将使用它:
$objSingleton = LogHelper::getInstance();
而且,你可能想要定义一个私有构造函数:
private function __construct() { }
答案 1 :(得分:1)
虽然单身人士起初看起来是理想的解决方案,但事实并非如此。了解注册管理机构和家属注入;当你开始进行单元测试时,它们会让你的生活更轻松。