0

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

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

例子;

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

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

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

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

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

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

function my_function($node) {

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

$my_node = $node;

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

我很想知道这是怎么可能的。pull() (或相关方法)如何覆盖尚未给出的变量?

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

4

2 回答 2

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 的属性。

于 2012-11-29T02:19:32.413 回答
0

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

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

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

于 2012-11-29T03:48:04.333 回答