如果不通过引用传递,变量如何被覆盖?

时间:2012-11-29 01:36:55

标签: php oop variables object

这是一个讨论话题,而不是“帮助我”的问题。

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

实施例

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

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

$ item是一个不相关的字符串。

此时,我不认为'pull()'方法的内容是相关的 - 我并不好奇它被覆盖的地方,我很好奇它是如何被覆盖的。

除非已将变量传递给方法,否则PHP如何更改变量?

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

function my_function($node) {

即使我复制了我的对象 即使我重命名var

$my_node = $node;

克隆的对象仍然被覆盖。 重命名的对象仍然被覆盖(即,它与名称无关。)

我很想知道这是怎么回事。 pull()(或相关方法)如何超越他们尚未给出的变量?

我需要重申;我不关心哪里值正在改变,我关心如何当它没有传递给方法时被更改。

2 个答案:

答案 0 :(得分: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上的属性。

答案 1 :(得分:0)

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

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

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