5

我在使用 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。我知道我是否将它们以菊花链形式连接起来,即__constructB 调用C::get或者D::get它可以工作,但这对我的目的来说不是最佳的。这是因为它们在同一范围内吗?如果是这样,有没有办法解决这个问题?我问这个更多的是出于好奇而不是实际目的——我知道我可以很容易地在它们中的每一个中实现单例模式。那么,有什么想法吗?谢谢!

PS 请不要有“单身人士是邪恶的,你应该在地狱中燃烧”的评论。我非常清楚这一点。

4

2 回答 2

2

请注意,static::$instance = new static调用 (in your case) 的构造函数A

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

只需添加

protected static $instance = null;

对他们来说,它应该可以正常工作。

于 2013-06-10T20:50:12.110 回答
1

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

要解决问题,只需定义

protected static $instance = null;

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

于 2013-06-10T20:53:56.663 回答