将PHP类字段传递给函数时,将它们分配给函数时不会设置字段,为什么?

时间:2010-11-22 00:39:56

标签: php arrays function object

正如描述所述,我有一个函数,它接受一个数组和一个对象作为参数,并根据对象的类型将所有对象字段分配给它们在数组中的相应值。对象都有不同的字段,但它们都有一个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中一样。这就是为什么只更改函数声明并没有解决问题。现在一切正常!

2 个答案:

答案 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值执行相同操作。 这意味着数组键必须相同。