我整天都在研究这个问题,但我还没有找到一个好的解决方案。
在我们开始之前:如果你认为答案是“单身人士”,那就不是,单身人士不允许进入项目。不要问我为什么,因为我不想再讨论这个问题了。 :)
所以这里(这只是一个例子):
现在的问题是......如何构建我的类,并确保只创建了一个A类实例?
我有道理吗?
答案 0 :(得分:1)
您可以将X
的第一个创建实例保留在X
类的静态属性中,如下所示:
class X {
static public $instance = null;
public function __construct() {
if (is_null(X::$instance)) {
X::$instance = $this;
}
...
}
}
然后,您可以在X::$instance->color
构造函数中引用B::__construct()
。
更好的方法可能是拥有B
工厂,将X
实例注入其中,让B
类期望X
实例作为构造函数参数:
class BFactory {
protected $x;
public function __construct($x) {
$this->x = $x;
}
public function make_instance() {
return new B($this->x);
}
}
$factory = new BFactory($X);
$instance = $factory->make_instance();
答案 1 :(得分:1)
我不太清楚你的申请的目的是什么。不过,您可以使用静态变量来跟踪对象。
class A
{
private static $instance_exists = false;
private static $color = 'green';
public function __construct() {
if(self::$instance_exists) {
throw new Exception('tried to create another instance of A');
}
self::$instance_exists = true;
}
public static function getColor() {
return self::$color;
}
public static function instanceExists() {
return self::$instance_exists;
}
}
class B {
private $color;
public function __construct() {
$this->color = A::getColor();
}
}
A::instanceExists(); // check anywhere
答案 2 :(得分:0)
在对象X上创建一种属性更改侦听器。
color
属性已更改,则每个对象B向对象X注册以接收通知。这可以在对象B构造函数中完成。不幸的是,当创建B的新实例时,它必须从某处获得有关可能存在的X的引用。如果这不是一个全局静态字段,可能是:
答案 3 :(得分:0)
在一些很酷的家伙和dudettes的帮助下。 :)
这是一个优雅的解决方案,并不是我想到的,但它确实有效。请注意,这仅仅是一个例子,还有更多的内容。
class A {
public $color;
function __construct($new_color) {$this->color = $new_color;}
}
class B extends A {}
$color = 'green';
$y[0] = new B($color);
$y[1] = new B($color);
$color = 'red';
$y[2] = new B($color);
$color = 'black';
$y[3] = new B($color);
感谢大家的意见和建议。它帮助了我们很多。谢谢......