PHP单例和继承

时间:2013-06-10 20:43:25

标签: php class inheritance static singleton

我在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。我知道如果我有点菊花链它们,那就是__construct的B调用C::getD::get它可以工作,但这对我的目的来说不是最佳的。这是因为它们属于同一范围吗?如果是这样,有什么方法吗?我问的更多的是好奇而不是实际目的 - 我知道我可以很容易地在每一个中实现单例模式。那么,有什么想法吗?谢谢!

P.S。请不要'单身人士是邪恶的,你应该在地狱里燃烧'评论。我非常清楚。

2 个答案:

答案 0 :(得分:2)

请注意,static::$instance = new static会调用(在您的情况下)A的构造函数。

使用您的解决方案,您的子类中的实例需要一个静态属性。

添加

protected static $instance = null;

给他们,它应该工作正常。

答案 1 :(得分:1)

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

要解决问题,只需定义

protected static $instance = null;

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