PHP单例和继承


PHP singletons and inheritance

我在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::getD::get,它可以工作,但这对我的目的来说不是最佳的。这是因为它们在同一个范围内吗?如果是这样,有什么办法可以解决这个问题吗?我问这个问题更多的是出于好奇,而不是出于实际目的——我知道我可以很容易地在它们中的每一个中实现单例模式。有什么想法吗?谢谢!

注:请不要发表"单身是邪恶的,你应该下地狱"的评论。我很清楚。

注意,static::$instance = new static调用(在您的例子中)A的构造函数。

在你的解决方案中,你需要在你的子类中为你的实例添加一个静态属性。

只需添加

protected static $instance = null;

,它应该可以正常工作。

在处理静态属性时,如果您希望继承的类的静态属性与基类不同,则必须为其提供一个住所。

要解决这个问题,只需定义

protected static $instance = null;

在派生类上。如果不是,它将使用基类的属性。