我在PHP中看到了一些与引用/赋值相关的令人困惑的行为......
private function doSomething($things)
{
foreach ($things as $thing) {
echo $thing->property; // 'foobar'
$copyThing = $thing;
unset($copyThing->property);
echo $thing->property; // undefined
我希望通过引用(&$thing
)传递变量时会出现这种情况,但我不想在这里尝试这样做,而且似乎无论如何都会发生这种情况。我错过了什么?
答案 0 :(得分:2)
只是解释我的评论:
foreach循环中的对象总是通过引用传递
当你对一个对象数组使用foreach循环时,你在循环中使用的变量是指向该对象的指针,因此它作为引用,对循环内对象的任何更改都是对象的更改外。 这是因为:
对象总是通过引用传递(@ user3137702引用)
详细和官方解释here。
复制和取消设置变量时:
$copyThing = $thing; unset($copyThing->property);
您正在创建另一个指针并取消它,因此原始值已消失。事实上,由于foreach循环也使用指针,$things
数组也会受到影响。
检查这个ideone(注意vardump [' a'属性消失的地方],因为输出与你的相同)
我不知道它改变了哪个版本,如果有的话,因为它似乎是默认对象/指针行为
作为一种解决方法(一些想法):
$x = clone($obj);
(只要默认的复制构造函数适用于您的对象)