2

クラス間でデータを渡すための正しいアプローチを見つけるのに苦労しています.クラスは互いに直接呼び出しておらず、親クラスを介してのみ関連しています(現在使用していますが、解決策に近いものではなく、汚い回避策と考えています) )。

入力の読み取りと出力の書き込みの両方が可能な 3 つのクラスがあり、構成に基づいて、1 つを読み取り、もう 1 つを書き込みに設定しました。同じクラスである場合もあります。それらはすべて親クラスを共有しますが、常にコントローラー クラスから呼び出される 2 つの別個のインスタンスです。

現在、私はこの種の機能を使用しています:

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 がそれらを受け取った後は常にデータをリセットする必要があります。

クラス継承の使用方法ではないことは確かですが、実際の解決策を見つけるのに苦労しています。親ではなく、これらのクラスを呼び出すコントローラーにデータを格納する必要があることは理にかなっていますが、私はすでにセッター関数とゲッター関数で戻り値を使用しており、これらの関数にそこに格納するために変数を参照渡ししていませんそこにはオプションのパラメーターがあり、コードをきれいに保とうとしています。

その場合、コントローラーを介してデータを渡す正しいアプローチは何でしょうか?

ありがとう!

4

1 に答える 1

1

最良のオプションは、2 つのオブジェクトが別の 3 番目のオブジェクトを共有することです。これは、交換を保証する「3 番目のオブジェクト」のクラスになります。

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 に答える