1

举这个例子。我从来没有注意到这样的行为:

class foo
{
    public $foo = 0;

    public function addFoo()
    {
        $this->foo = $this->foo + 1;

        return $this;
    }
}

$bar = new foo;

$a = $bar;
$b = $bar->addFoo();
$c = $bar->addFoo();

我假设脚本完成后:

$a->foo 是:0

$b->foo 是:1

$c->foo 是:2

但事实并非如此。我得到:

$a->foo 是:2

$b->foo 是:2

$c->foo 是:2

我不明白,为什么 $a->foo 是 2。它不是指针,也永远不会改变。

也许有人可以解释或向我展示 PHP 文档的链接,其中涵盖了这一点。

谢谢你。

4

3 回答 3

2

对象总是“通过引用”传递*。如果您将一个对象分配给另一个变量或从函数中返回它,您并没有创建该对象的副本。要显式复制对象,您需要clone它。

* 虽然不是&“参考”的意思。见http://php.net/manual/en/language.oop5.references.php

于 2013-05-15T12:47:18.027 回答
0

你正在做的是这个

$bar = new foo();

$a = $bar;

$b = $bar->addFoo();
$c = $bar->addFoo();
echo $a->foo;
echo  $b->foo;
echo  $c->foo;

o/p = 2, 2, 2

这将始终返回 2,因为它在完成所有添加操作后返回类的 $foo(即 $this) 变量的最后一个值。

试试这个来得到你想要的

$bar = new foo();

$a = $bar;
echo $a->foo;

$b = $bar->addFoo();
echo  $b->foo;

$c = $bar->addFoo();
echo  $c->foo;

 o/p = 0, 1, 2

这将为您提供 0、1、2 输出,因为它将在每次添加操作后打印 $foo 的值。

因此,总结一下您的 addFoo() 函数正在返回类对象,因此在以前的情况下,类对象持有 $foo 的值,当您再次调用 addFoo() 时,它会将 + 1 添加到 $foo 变量。因此,所有变量都持有相同的类对象。

于 2013-05-15T12:10:25.763 回答
0

从 PHP 5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者找到实际对象。当一个对象通过参数发送、返回或分配给另一个变量时,它们持有标识符的副本,该标识符指向同一个对象。$this 是对调用对象的引用。在您的情况下,当您返回 $this 时,您将返回对对象 $bar 的引用,并且 $a、$b 和 $c 保存标识符 $bar 的副本。

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

于 2013-05-15T12:47:39.293 回答