ネストされたオブジェクト (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...
));
まだこれについて考えています... 何か考えはありますか?