gpt4 book ai didi

PHP 单例和继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:38 26 4
gpt4 key购买 nike

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

附言请不要发表“单例是邪恶的,你应该在 hell 中燃烧”的评论。我非常清楚这一点。

最佳答案

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

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

只需添加

protected static $instance = null;

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

关于PHP 单例和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17032480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com