2011-04-15 74 views
0

我正在为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

这与Ruby提供的mixin类似。我也会遵循@ jesse的建议 – Wes 2011-04-15 21:20:44

+0

[为什么Singletons在PHP中没有用处](http://gooh.posterous.com/singletons-in-php) – Gordon 2011-04-15 22:07:32

回答

2

您可能需要将您的getInstance()方法定义为静态,以便您可以在不必实例化类的情况下访问它们。然后,你会使用这个:

$objSingleton = LogHelper::getInstance(); 

而且,你可能会想定义私有构造:

private function __construct() { } 
+0

谢谢,我一直在寻找这个在PHP一段时间 – rekaszeru 2011-04-15 21:20:06

1

虽然单身看起来像最初的理想解决方案,他们不是。了解注册和注入注入;当你开始单元测试时,他们会让你的生活更轻松。