我有一些代码,比如打击,
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);
会很好。
答案 0 :(得分:1)
最好的解释在这里,也有像你这样的例子:
http://php.net/manual/en/language.oop5.references.php
长话短说:当您应用resFilter方法时,您发送$resLog
对象作为输入,并且该对象具有与$res
相同的标识符,因为您创建了$resLog = $res;
它更像是同样的事情,如果你有一个普通的变量,但在方法中用参考发送它。
当一个对象通过参数发送,返回或分配给另一个对象时 变量,不同的变量不是别名:它们持有副本 标识符指向同一个对象。
答案 1 :(得分:1)
除非另有说明,否则PHP会实现浅拷贝。因此,当您复制对象时,实际上并未完全克隆它,而是使用引用。因此,$this->resFilter($resLog);
调用也会删除引用对象中的ID
个问题。