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

时间:2011-05-28 22:59:38

标签: php object pass-by-reference

如果在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

这样:

  

通过引用传递不一样   分配

那么为什么下面的$foo(100, 2, 3)

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

$x = $foo;            
$x->xxx = 100;

print_r($foo);

4 个答案:

答案 0 :(得分:5)

问题在于:

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

在第一条规则上,$ x被引用到$ foo;编辑$ x wil也可以编辑$ foo;
(这称为“按参考分配”,而不是“按引用传递”* 1)

$x->myProperty= "Hi";

将导致$ foo也拥有属性“myProperty”。

但是在下一行中,您将$ x引用到new对象 从$ foo有效地引用$ x,你对$ x所做的所有更改都不会传播到$ foo。


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

答案 1 :(得分:2)

不仅通过引用传递对象; they are also assigned by reference(这就是你实际谈论的内容):

  

PHP中的值行为通常赋值的异常发生在对象上,这些对象在PHP 5中通过引用分配。

但是,在第一个示例中,您正在执行强制转换操作。 This entails a copy

  

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

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

答案 2 :(得分:1)

通过引用传递与assign不同。

答案 3 :(得分:0)

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

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

详情请见Objects and References