2010-08-19 68 views
4

我想定义一个Singleton基本类型可供用户会从中得到他的课,所以这是我的想法:是否可以在PHP中定义一个接口Singleton?


interface SingletonInterface { 
    public static function getInstance(); 
} 

abstract class SingletonAbstract implements SingletonInterface { 
    abstract protected function __construct(); 
    final private function __clone() {} 
} 

但是,使用这种形式给出,用户可以实现这个单...


class BadImpl implements SingletonInterface { 
    public static function getInstance() { 
     return new self; 
    } 
} 

你会怎么做?

+0

*(相关)* [单身人士有什么好坏](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) – Gordon 2010-08-19 06:51:23

回答

2

我使用此代码创建一个Singleton:

abstract class Singleton { 

    private static $_aInstance = array(); 


    private function __construct() {} 

    public static function getInstance() { 

     $sClassName = get_called_class(); 

     if(!isset(self::$_aInstance[ $sClassName ])) { 

      self::$_aInstance[ $sClassName ] = new $sClassName(); 
     } 
     $oInstance = self::$_aInstance[ $sClassName ]; 

     return $oInstance; 
    } 

    final private function __clone() {} 
} 

这是使用这种模式的:

class Example extends Singleton { 
    ... 
} 

$oExample1 = Example::getInstance(); 
$oExample2 = Example::getInstance(); 

if(is_a($oExample1, 'Example') && $oExample1 === $oExample2){ 

    echo 'Same'; 

} else { 

    echo 'Different'; 
} 
+0

我认为这种方法,但它有一些缺点.. 1 PHP 5.3需要 2.您类作为一个SingletonContainer 3.派生类被认为是不同 4.要调用构造函数 但它的优点是,你只需要扩展该类以拥有一个Singleton – eridal 2010-08-19 13:59:11

3

记住PHP不允许多重继承,所以你必须仔细选择你建立你的课程。 Singleton很容易实现,所以让每个类定义它可能会更好。 还要小心,私人领域没有移植到后代类,因此你可以有两个不同的字段具有相同的名称。

0

首先:如果你有这么多单身以上的项目,那么你可能弄乱的东西上投射水平

所有第二:辛格尔顿应该有使用,只有在那里,更多的是一个实例一类可以完全没有任何意义或者可能导致一些错误

最后:继承的目的不是要减少代码

0

现在,您可以使用特征量,但你需要这么多的单身?

相关问题