1

ネストされたオブジェクト (objTwo を objOne のプロパティとして使用) を使用する場合:

$objOne->property = new ObjTwo($objOne);

コミュニケーションをとるための最良の方法は何ですか? ここに私が考えることができるいくつかの方法があります:

特定の get/set メソッドの使用

class ObjTwo {
    __construct($objOne){
        $prop1 = $objOne->get_prop1(); 
        // do something with prop1
        $prop2 = $objOne->get_prop2();
        // do something with prop2

        // ... Having to write all these out is kind of a pain
        //     if you're going to have 20+ vars, and there's no
        //     easy way to loop through them.
    }
}

問題:これらを 1 行ずつ書き出すと、新しいプロパティを追加するときに更新する必要があります。

プロパティごとに get/set メソッドを使用することをお勧めしますが、データをループしたいのですが...

get_object_vars() はどうですか

class ObjTwo {
    __construct($objOne){
        extract(get_object_vars($objOne));
        // do something with the vars
    }
}

問題:このメソッドは getter/setter メソッドを使用する機能をバイパスし、各プロパティにアクセスするにはパブリックにする必要があります。

動的 getter/setter メソッド呼び出し

私が考えたもう 1 つの方法は、フィールドの配列を作成し、getter/setter メソッドの名前を厳密に付けるというものです。

class ObjTwo {
    __construct($objOne){
        $prop_array = array('prop1', 'prop2', 'prop_three');
        $values = array();
        foreach ($prop_array as $prop){
            $values[$prop] = $objOne->get_{$prop}();
        }
    }
}

問題:新しいプロパティを追加するたびに、get_method() の名前を正しく指定し、$prop_array を更新する必要があります。

誰にもより良い解決策がありますか?たぶん、データの配列を構築するだけですか?:

$objOne->property = new ObjTwo($objOne->get_data());

私はこの解決策が好きです

これを熟考した上で、ここで少し明確にします。親から子へ、またはその逆に同一のコピーを作成しようとしているわけではありません。上記の例を編集して、それを少し改善しました。オブジェクトのデータのサブセットをある場所から別の場所に渡すという考えにすぎません。

書く代わりに:

$first_name = $this->member->get_first_name();
$last_name = $this->member->get_last_name();
$email = $this->member->get_email();
$display_name = $this->member->get_display_name();
// etc... and
$this->member->set_first_name($first_name);
$this->member->set_last_name($last_name);
$this->member->set_email($email);
$this->member->set_display_name($display_name);
// etc..

方法を考えてみてはどう$this->member->get_fields('first_name', 'last_name', 'email', 'display_name');ですか?フィールド名 (fname、f_name、first_name など) を正確に覚える必要がないので、クラス定数を使用できます。

$data = $this->member->get_fields(array(
    Member::FIRST_NAME, Member::LAST_NAME, Member::EMAIL, Member::DISPLAY_NAME
));

このようにして、返されたデータをループできます。

foreach ($data as $key=>$value) // ...

そしてフィールドの設定...

$this->member->set_fields(array(
    Member::FIRST_NAME => $first_name,   //  THE BIG ADVANTAGE HERE:
    Member::LAST_NAME => $last_name,     //  These field keys auto-complete
    Member::EMAIL => $email,             //  so you don't have to remember them!
    Member::DISPLAY_NAME => $display_name,
    // etc...
));

まだこれについて考えています... 何か考えはありますか?

4

2 に答える 2

0

あなたは間違った質問をしていると思います。さらに、それらの疑似例の代わりに実際の例を提供した場合にのみ、本当に役立つと思います。適切な解決策に関しては、実際の状況はそれぞれ異なります。

一般的に、あなたのすべての提案はにおいがします。必要なのはインジェクションではなく継承のようです。「子」クラスが別のクラスのすべてまたはほとんどのプロパティに本当にアクセスする必要がある場合は、そのクラスを拡張する必要があるようです。

ソフトウェアの各部分は、お互いについてできる限り認識しないようにする必要があります。あなたのコメントでは、Member クラスと Form クラスがあると述べています。なぜ彼らの誰かが他の人について何も知らなければならないのか、私にはわかりません。

さらに、すべてのプロパティを新しいクラスのプロパティにマップする必要があるという印象を受けているようです。なんで?クラスのインスタンスを custructor (= 依存性注入) を介して別のクラスに渡す場合、そのインスタンスをプロパティにマップし、そのインスタンスを介して注入されたインスタンスのすべてのプロパティにアクセスできます。マッピングは必要ありません。

class Consumer
{
    private $injectedClass;

    function __construct($injectedClass)
    {
        $this->injectedClass = $injectedClass;
    }

    public function someFunction()
    {
        //do something by using any property of the injected class
        $this->injectedClass->getProperty();
    }
}
于 2012-11-14T20:45:13.730 に答える
-1

私はこのようにする傾向があります。これは最善の方法ではないかもしれません:

class Parent_Obj {
    $var1; // explanation
    $var2; // explanation
    $var3; // explanation
    $child_obj; // explanation

    __construction() {
        /* Do a bunch of stuff */
        $this->$child_obj = new Child_Obj ($this);
    }
}

class Child_Obj {
    $var1; // explanation
    $var2; // explanation
    $var3; // explanation
    $parent_obj; // explanation

    __construction($parent) {
        /* Do a bunch of stuff */
        $this->$parent_obj = $parent;
    }

    /* Some function that needs a method or property of the parent object */
    function some_function () { 
        /* do some stuff */
        echo $this->parent_obj->var1; // echo a property of the parent obj
    }
}

この用語は「集約」と呼ばれていると思います。

于 2012-11-14T19:16:07.567 に答える