为什么对象$ result已被更改

时间:2015-08-18 07:42:21

标签: php object

我有一些代码,比如打击,

class Tool{
    function getData(){
        $res = array('name'=>'jay','age'=>22,'job'=>'developer','ID'=>1233211234567);
        $res = (object)$res;
        var_dump(111,$res);
        $resLog = $res;
        $this->resFilter($resLog);
        var_dump(222,$res);
        //...log code
    }
    function resFilter($res){
        unset($res->ID);
    }
}
echo '<pre>';
$t = new Tool;
$t->getData();
die;

我怀疑为什么在函数resFilter中调用函数getData后,var_dump(222,$res);将是这样的:

int(111)
object(stdClass)#2 (4) {
  ["name"]=>
  string(3) "jay"
  ["age"]=>
  int(22)
  ["job"]=>
  string(9) "developer"
  ["ID"]=>
  int(1233211234567)
}
int(222)
object(stdClass)#2 (3) {
  ["name"]=>
  string(3) "jay"
  ["age"]=>
  int(22)
  ["job"]=>
  string(9) "developer"
}

所以你可以在var_dump的第二部分看到没有ID字段?谁能帮助我,告诉我为什么?

更新:  谢谢你的回答,我试试这个$resLog = clone($res);会很好。

2 个答案:

答案 0 :(得分:1)

最好的解释在这里,也有像你这样的例子:

http://php.net/manual/en/language.oop5.references.php

长话短说:当您应用resFilter方法时,您发送$resLog对象作为输入,并且该对象具有与$res相同的标识符,因为您创建了$resLog = $res;它更像是同样的事情,如果你有一个普通的变量,但在方法中用参考发送它。

  

当一个对象通过参数发送,返回或分配给另一个对象时   变量,不同的变量不是别名:它们持有副本   标识符指向同一个对象

答案 1 :(得分:1)

除非另有说明,否则PHP会实现浅拷贝。因此,当您复制对象时,实际上并未完全克隆它,而是使用引用。因此,$this->resFilter($resLog);调用也会删除引用对象中的ID个问题。