首先,我相信我的问题与this question不同。
我已经为我正在处理 的应用程序编写了自己的框架,但我遇到了一个特定的(IMO,次要)架构问题,我认为应该有更好的解决方案 < /强>
假设两个类继承自单个父级:
class AAA {
public function __construct() {
$this->go_between = __CLASS__;
}
// many other methods in here which BBB and CCC require
}
class BBB extends AAA {
public function __construct() {
parent::__construct();
}
public function mutatorBBB() {
$this->go_between = __CLASS__;
}
}
class CCC extends AAA {
public function __construct() {
parent::__construct();
}
public function returnValue() {
return $this->go_between;
}
}
现在假设您需要BBB
和CCC
中的“go_between”变量,因为BBB
中的某个地方,您必须使用CCC
中的方法,即
$CCC = new CCC(); // somewhere in class BBB so the methods of CCC can be used
因此,如果您在索引中运行以下代码:
$BBB = new BBB();
$CCC = new CCC();
echo $BBB->go_between;
echo "\n";
echo $CCC->go_between;
生成以下预期输出:
AAA
AAA
但是,假设您更新了其中一个子类中“中间”构造函数的值:
$BBB->mutatorBBB();
echo $BBB->go_between;
echo "\n";
echo $CCC->returnValue();
在这种情况下,会生成以下输出:
BBB // mutatorBBB() updated the value of $this->go_between
AAA // Why doesn't class CCC "see" the updated value of the go-between variable? That is, why doesn't CCC "see" the value as updated by mutatorBBB()? (that is ----> 'BBB')
我能够很容易地解决这个问题,但我不相信这是“最佳实践”:
class Common {
static $go_between; // initialize
}
现在稍微重新考虑这些类:
class AAA {
public function __construct() {
Common::$go_between = __CLASS__;
}
// many other methods in here which BBB and CCC require
}
class BBB extends AAA {
public function __construct() {
parent::__construct();
}
public function mutatorBBB() {
Common::$go_between = __CLASS__;
}
}
class CCC extends AAA {
public function __construct() {
parent::__construct();
}
public function returnValue() {
return Common::$go_between;
}
}
现在输出如下:
$BBB->mutatorBBB();
echo Common::$go_between;
echo "\n";
echo $CCC->returnValue();
是这个(即我申请的理想结果):
BBB
BBB
我一再不得不退回到全局命名空间中的static
类来完成此任务。
是否有一种更“面向对象”的方式来更新来自父构造函数的中间变量,该子构造函数由2个子类使用,其中一个子实例化并需要第二个子类? < / p>