可以在PHP中定义一个接口Singleton吗?

时间:2010-08-19 04:32:48

标签: php oop singleton

我想定义一个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;
    }
}

你的方法是什么?

4 个答案:

答案 0 :(得分:3)

我正在使用此代码创建一个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';
}

答案 1 :(得分:3)

记住PHP不允许多重继承,因此您必须仔细选择基于类的内容。 Singleton很容易实现,让每个类定义它可能更好。 还要注意私有字段没有移植到后代类,因此您可以有两个具有相同名称的不同字段。

答案 2 :(得分:0)

首先:如果你在项目中拥有这么多单身人士,那么你可能会在投影水平上弄乱一些东西

其次:Singleton应该在那里使用,并且只在那里使用,其中一个类的一个实例完全没有意义或可能导致一些错误

最后:继承不是为减少代码量而设计的

答案 3 :(得分:0)

你现在可以使用特质,但是你需要这么多的单身吗?