gpt4 book ai didi

php - 2个单例类可以相互引用吗?

转载 作者:可可西里 更新时间:2023-11-01 00:26:42 24 4
gpt4 key购买 nike

为什么这不起作用?每个实例不应该简单地相互引用一次吗?

class foo {
private static $instance;
private function __construct() {
$test = bar::get_instance();
}

public static function get_instance() {
if (empty(self::$instance)) {
self::$instance = new foo();
}
return self::$instance;
}
}

class bar {
private static $instance;
public function __construct() {
$test = foo::get_instance();
}

public static function get_instance() {
if (empty(self::$instance)) {
self::$instance = new bar();
}
return self::$instance;
}
}

$test = foo::get_instance();

最佳答案

你有一个所谓的 circular-dependency . A需要B完成构建,B需要A完成构建。就这样一直循环下去。

基本上,发生的事情是每个类的 self::$instancenew class() 完成之前不会被填充。所以在构造函数中,您正在调用另一个 getInstance。但是每次您点击 get_instance() 时,self::$instance 仍然是 null,因为之前的 new 从未完成。你转了一圈又一圈。它会一直持续到最后。

相反,在构建之后添加它:

class foo {
private static $instance;
private function __construct() {
}
private function setBar(bar $bar) {
$this->bar = $bar;
}

public static function get_instance() {
if (empty(self::$instance)) {
self::$instance = new foo();
self::$instance->setBar(bar::get_instance());
}
return self::$instance;
}
}

class bar {
private static $instance;
public function __construct() {
}
private function setFoo(foo $foo) {
$this->foo = $foo;
}
public static function get_instance() {
if (empty(self::$instance)) {
self::$instance = new bar();
self::$instance->setFoo(foo::get_instance());
}
return self::$instance;
}
}

但是,我真的建议重新构建您的关系和类,以便您 Inject the Dependencies而不是制造独立的单例。

关于php - 2个单例类可以相互引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903387/

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