正如描述所述,我有一个函数,它接受一个数组和一个对象作为参数,并根据对象的类型将所有对象字段分配给它们在数组中的相应值。对象都有不同的字段,但它们都有一个type属性,函数用它来确定要分配的字段。
它的工作原理如下:
function unload($arr,&$obj){ <-- //&$obj not $obj
if($obj->type == 'A'){
echo 'Setting field for A';
$obj->a = $arr['a_value'];
//some more assignments..
}
elseif($obj->type == 'B'){
$obj->b = $arr['b_value'];
echo 'Setting field for B';
//some more assignments...
}
//some more elseifs
//return an error if
//object's type doesn't
//match
else{
echo 'Error: Object type '.$obj->type.' not recognized.';
}
}
$arr['a_value'] = 'SomeValue';
$arr['b_value'] = 'SomeOtherValue';
$obj = new A(); //A's type set to 'A' upon initialization
unload($arr,$obj);
echo 'A->a set to: '.$obj->a;
输出: A->设置为:
代码为传入的对象输入正确的分支,但没有分配对象的字段。我究竟做错了什么?
服务器正在运行PHP 4.4.7,我仍然不知道造成这种情况的原因。
编辑:我终于明白了,这是两件事的组合:
我没有意识到在类中引用类字段名时需要$this
关键字。我假设变量具有全局范围,因此$this
是可选的,就像在Java中一样。这就是为什么只更改函数声明并没有解决问题。现在一切正常!
答案 0 :(得分:2)
您使用的是哪个PHP版本?
因为在PHP4中你需要通过引用显式传递对象:
function unload($arr,&$obj){
如果您使用的是PHP5,请仔细检查$arr
内容。并在函数内部和外部执行一些print_r
...
答案 1 :(得分:0)
get_class()
来返回课程名称。A->a
代替$obj->a
?这似乎是错的。switch
最适合您的需求。编辑最后得到了:你必须替换
$arr['a'] = 'SomeValue';
$arr['b'] = 'SomeOtherValue';
与
$arr['a_value'] = 'SomeValue';
$arr['b_value'] = 'SomeOtherValue';
或以其他方式将$obj->b = $arr['a_value'];
设置为$obj->b = $arr['a'];
并对b值执行相同操作。
这意味着数组键必须相同。