通过引用传递;为什么原始对象没有更改


Passing by reference; why is the original object not changed?

如果在PHP5中通过引用传递对象,那么为什么下面的$foo没有改变?

$foo = array(1, 2, 3);
$foo = (object)$foo;
$x = $foo;            // $x = &$foo makes $foo (5)!
$x = (object)array(5);
print_r($foo); // still 1,2,3

所以:

通过引用传递与分配

那么为什么下面的CCD_ 2是CCD_?

$foo = array('xxx' => 1, 'yyy' => 2, 'zzz' => 3);
$foo = (object)$foo;
$x = $foo;            
$x->xxx = 100;
print_r($foo);

问题就在这里:

$x = $foo;   
$x = (object)array(5);

在第一条规则中,$x被引用到$foo;编辑$xwil也编辑$foo
(这被称为"通过引用分配",而不是"通过引用传递"*1)

$x->myProperty= "Hi";

将导致$foo也有一个属性"myProperty"。

但是在下一行中,您将$x引用到一个new对象
实际上,从$foo中取消引用$x,您对$x所做的所有更改都不会对$foo产生影响。


*1:调用函数时,传递给函数的对象是(在php5中)"通过引用传递"

对象不仅通过引用传递;它们也被通过引用分配(这就是你实际谈论的):

PHP中常见的按值分配行为的一个例外是对象,它们在PHP5中是通过引用分配的。

但是,在第一个示例中,您正在执行强制转换操作。这需要一个副本:

如果将任何其他类型的值转换为对象,则会创建stdClass内置类的新实例。

数组在PHP中有自己的类型,并且不是对象;因此上述规则适用。

通过引用传递与赋值不同。

首先,通过将数组强制转换为对象来创建对象。然后创建变量并通过引用传递该对象。但它不起作用,因为在那之后,您将一些其他对象(从新数组中投射)分配到第二个变量中。

结果是,引用更改为第二个对象,第一个对象本身没有更改。

请参阅有关对象和引用的更多详细信息。