当一个子类更新构造函数变量的值时,如何更新BOTH子类中的父构造函数变量?

时间:2017-05-12 14:36:50

标签: php oop constructor

首先,我相信我的问题与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;
    }
}

现在假设您需要BBBCCC中的“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>

0 个答案:

没有答案