如果在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);
答案 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)
首先,您通过将数组转换为对象来创建对象。然后创建变量并通过引用传递该对象。但是它不起作用,因为在那之后你将一些其他对象(从新数组中转换)分配到第二个变量中。
结果是引用更改为第二个对象,第一个对象本身未更改。