我在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() {
}
}
我有一堆继承那个单例类的类,称它们为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的__construct
调用C::get
或D::get
,它可以工作,但这对我的目的来说不是最佳的。这是因为它们在同一个范围内吗?如果是这样,有什么办法可以解决这个问题吗?我问这个问题更多的是出于好奇,而不是出于实际目的——我知道我可以很容易地在它们中的每一个中实现单例模式。有什么想法吗?谢谢!
注:请不要发表"单身是邪恶的,你应该下地狱"的评论。我很清楚。
注意,static::$instance = new static
调用(在您的例子中)A
的构造函数。
在你的解决方案中,你需要在你的子类中为你的实例添加一个静态属性。
只需添加
protected static $instance = null;
,它应该可以正常工作。
在处理静态属性时,如果您希望继承的类的静态属性与基类不同,则必须为其提供一个住所。
要解决这个问题,只需定义
protected static $instance = null;
在派生类上。如果不是,它将使用基类的属性。