我想定义一个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 :(得分: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)
你现在可以使用特质,但是你需要这么多的单身吗?