2

我正在努力寻找一种在类之间传递数据的正确方法,这些类不直接相互调用,并且仅通过父类相关(我现在使用它,但我认为这是一种肮脏的解决方法,而不是解决方案附近的任何东西)。

我有 3 个类都能够读取输入和写入输出,并且根据配置,我将一个设置为读取,另一个设置为写入。它甚至可能是同一个类,它们都共享一个父类,但它们始终是从控制器类调用的两个独立实例。

目前我使用这种功能:

class daddy {
    public static $data;
}

class son extends daddy {
    public function setData() {
        parent::$data = "candy";
    }
}

class daughter extends daddy {
    public function getData() {
        echo parent::$data;
    }
}

while($processALineFromConfig)
    $son = new son;
    $son->setData();

    $daughter = new daughter;
    $daughter->getData();
    daddy::$data = null; //reset the data, in the actual code $daughter does that in parent::
}

这些类的实例化在一个循环中运行,因此我总是需要在 $daughter 接收到它们之后重置数据,因为否则它会留在那里再次通过循环。

我绝对确定这不是应该如何使用类继承,但是我正在努力寻找一个真正的解决方案。数据应该存储在调用这些类的控制器中才有意义,而不是父类,但是我已经在 setter 和 getter 函数中使用了返回值,并且我没有通过引用传递变量来将其存储到这些函数中'因为我在那里有可选参数,我试图保持代码干净。

那么通过控制器传递数据的正确方法是什么?

谢谢!

4

1 回答 1

1

最好的选择是让两个对象共享一些其他的第三个对象。这将是“第三个对象”的类,它将确保交换:

class Messenger
{
    private $data;

    public function store($value)
    {
        $this->data = $value;
    }

    public function fetch()
    {
        return $this->data;
    }
}

然后是两个实例的类,需要共享一些状态:

class FooBar
{

    private $messenger;
    private $name = 'Nobody';

    public function __construct($messenger, $name)
    {
        $this->messenger = messenger;
        $this->name = $name;
    }

    public function setSharedParam($value)
    {
        $this->messenger->store($value);
    }

    public function getSharedParameter()
    {
        return $this->name . ': ' . $this->messenger->fetch();
    }
}

你使用这样的类:

$conduit = new Messenger;

$john = new FooBar($conduit, 'Crichton');
$dominar = new FooBar($conduit, 'Rygel');

$dominar->setSharedParameter('crackers');
echo $john->getSharedParameter();
// Crichton: crackers

基本上,它们都在访问同一个对象。这也可以通过使两个实例都观察的实例来进一步扩展Messenger

于 2013-09-29T10:13:04.330 回答