为什么我的PHP对象通过引用传递

时间:2016-08-03 21:59:55

标签: php pass-by-reference variable-assignment

我在PHP中看到了一些与引用/赋值相关的令人困惑的行为......

private function doSomething($things)
{
    foreach ($things as $thing) {
        echo $thing->property; // 'foobar'
        $copyThing = $thing;
        unset($copyThing->property);
        echo $thing->property; // undefined

我希望通过引用(&$thing)传递变量时会出现这种情况,但我不想在这里尝试这样做,而且似乎无论如何都会发生这种情况。我错过了什么?

1 个答案:

答案 0 :(得分:2)

只是解释我的评论:

  

foreach循环中的对象总是通过引用传递

当你对一个对象数组使用foreach循环时,你在循环中使用的变量是指向该对象的指针,因此它作为引用,对循环内对象的任何更改都是对象的更改外。 这是因为:

  

对象总是通过引用传递(@ user3137702引用)

详细和官方解释here

复制和取消设置变量时:

$copyThing = $thing;
unset($copyThing->property);

您正在创建另一个指针并取消它,因此原始值已消失。事实上,由于foreach循环也使用指针,$things数组也会受到影响。

检查这个ideone(注意vardump [' a'属性消失的地方],因为输出与你的相同)

我不知道它改变了哪个版本,如果有的话,因为它似乎是默认对象/指针行为

作为一种解决方法(一些想法):

  1. 复制您的初始数组
  2. 使用clone$x = clone($obj);(只要默认的复制构造函数适用于您的对象)