使用嵌套对象(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.
}
}
问题:逐行写出这些内容,并在添加新属性时不得不更新它。
我知道建议为每个属性使用get / set方法,但是我真的想循环遍历数据......
get_object_vars()
怎么样?class ObjTwo {
__construct($objOne){
extract(get_object_vars($objOne));
// do something with the vars
}
}
问题:此方法绕过了使用getter / setter方法的能力,并且每个属性都必须公开才能访问。
动态getter / setter方法调用
我考虑的另一种方法是创建一个字段数组,并且有一个严格的命名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...
));
还在考虑这个......任何想法?
答案 0 :(得分:0)
我认为你问的是错误的问题。此外,我认为只有提供真实示例而不是那些伪示例才能真正提供帮助。在适当的解决方案中,每种实际情况都不同。
通常你的所有提案都有异味。看来你需要的不是注射而是继承。如果你的'child'类确实需要访问另一个类的所有或大多数属性,那么它似乎应该扩展该类。
软件的各个部分应尽可能少地了解彼此。在您的评论中,您提到您有一个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();
}
}
答案 1 :(得分:-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
}
}
我认为这个术语叫做“聚合”。