【发布时间】:2013-06-10 20:43:24
【问题描述】:
我在使用 PHP 继承时遇到了一些问题。这是交易:
我有这个基类,Singleton:
namespace My_Namespace;
abstract class Singleton {
protected static $instance = null;
static function get() {
if ( null == static::$instance ) {
static::$instance = new static;
}
return static::$instance;
}
private function __construct() {
}
}
我有一堆继承了 Singleton 类的类,称它们为 A、B、C、D。其中一个看起来像这样:
namespace My_Namespace;
class A extends Singleton {
protected function __construct() {
B::get();
if ( some_condition() ) {
C::get();
}
else {
D::get();
}
}
}
现在,我只需执行 A::get() 即可让一切顺利进行。正如预期的那样,调用了 A 的构造函数。然后,调用 B 的构造函数,同样没有问题。现在变得很奇怪。一旦调用了C::get(),它就会将static::$instance 识别为B 类的对象并且根本不实例化C。我知道我是否有点菊花链式连接它们,即 B 调用 C::get 或 D::get 的 __construct 它可以工作,但这对我的目的来说不是最佳的。这是因为它们在同一范围内吗?如果是这样,有没有办法解决这个问题?我问这个更多的是出于好奇而不是实际目的——我知道我可以很容易地在它们中的每一个中实现单例模式。那么,有什么想法吗?谢谢!
附:请不要“单身人士是邪恶的,你应该在地狱中燃烧”cmets。我很清楚这一点。
【问题讨论】:
-
为
no ... burn in hell comments+1 -
我相信继承的类需要一个静态属性才能将实例推入......所以将
protected static $instance = null;添加到子类中。 -
@Orangepill 你明白了。我添加了那条线,一切都按预期工作。
BUT:这有点让整个 Singleton 类和继承的东西毫无用处......我们的想法是将单例功能包含在该类中。这可能吗? -
不...如果您没有将其塞入其中的属性,它将回退到继承属性,从静态意义上讲,它是基类类属性。 :(
标签: php class inheritance static singleton