这是一个讨论话题,而不是“帮助我”的问题。
我刚遇到一个奇怪的问题。未在任何地方传递变量(对象)时会被覆盖。
实施例
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()(或相关方法)如何超越他们尚未给出的变量?
我需要重申;我不关心哪里值正在改变,我关心如何当它没有传递给方法时被更改。
答案 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的一个重要部分是总是通过引用传递,我完全忘记了。
这使得被调用的方法很可能通过引用访问我的对象,并使这个问题看起来很愚蠢。 :)