2012-11-29 24 views
0

这是一个讨论主题,而不是“帮助我”的问题。如果不通过引用传递变量,如何覆盖变量?

我刚刚遇到一个奇怪的问题。变量(对象)在未传递到任何地方时被覆盖。

示例;

var_dump($node->title); 
$entity = $server->pull($item); 
var_dump($node->title); 

两个var_dumps显示两个不同的值。

$ item是不相关的字符串。

在这一点上,我不认为'拉()'方法的内容是相关的 - 我不是很好奇在哪里被覆盖,我很好奇它被覆盖。

PHP如何改变变量,除非已经传递给方法?

我的函数中没有引用,节点是直接传递的;

function my_function($node) { 

即使我让我的对象 的克隆即使我重新命名了var

$my_node = $node; 

克隆的对象是仍然覆盖。 重命名的对象是仍然覆盖(即,它不涉及名称。)

我很想知道这是可能的。 pull()(或相关的方法)如何超过一个他们还没有给出的变量?

我需要重申;我不在乎其中的价值正在改变,我关心它是如何改变,当它没有传递给方法。

回答

1

这样做:

$my_node = $node; 

实际上并不克隆对象。如果更改$ my_node,则它将仍然反映在$ node中,因为它们都只是指向该对象的指针,请参见http://www.php.net/manual/en/language.oop5.references.php

因此,可能某件事正在作用于$ node或$ node的副本并因此更改该对象。

从上面的链接见下面的例子:

class A { 
    public $foo = 1; 
} 

$a = new A; 
$b = $a;  // $a and $b are copies of the same identifier 
      // ($a) = ($b) = <id> 
$b->foo = 2; 
echo $a->foo."\n"; 

即使我们做了$ B = $ A,如果我们改变$ B的财产,它的变化对$ a的属性。

+0

稀释是,我的错误,并感谢在清除了(我更新了我的问题,以反映这一点。)但是这仍然没有解释它是如何被覆盖。 – Christian

0

因此,PHP5中面向对象的一个​​重要部分是对象是总是通过引用传递,我完全忘记了。

这使得被调用的方法更有可能通过引用访问我的对象,并使这个问题看起来很愚蠢。:)

http://php.net/manual/en/language.oop5.references.php

+0

请接受实际上指向的现有答案。或者至少接受*任何*答案;) – hakre