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

Ale*_*lex 5 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
Run Code Online (Sandbox Code Playgroud)

所以:

通过引用传递与assign不同.

那么为什么$foo以下(100, 2, 3)呢?

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

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

print_r($foo);
Run Code Online (Sandbox Code Playgroud)

Bob*_*ger 5

问题在于:

$x = $foo;   
$x = (object)array(5);
Run Code Online (Sandbox Code Playgroud)

在第一个规则上,$ x引用了$ foo; 编辑$ x wil也编辑$ foo;
(这称为"按参考分配",而不是"通过引用传递"*1)

$x->myProperty= "Hi";
Run Code Online (Sandbox Code Playgroud)

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

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


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

  • @Alex:我同意.PHP通过引用分配对象的策略使我的皮肤爬行. (2认同)