举个例子。我从未注意到这样的行为:
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文档的链接,其中包含了这些内容。
谢谢。
答案 0 :(得分:1)
对象总是“通过引用”传递*。如果您将对象分配给另一个变量或从函数返回它,您没有创建该对象的副本。要显式复制对象,您需要{{ 1}}它。
*虽然不在“{1}}”的意思中。请参阅http://php.net/manual/en/language.oop5.references.php
答案 1 :(得分: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()时,它会向$ foo添加+ 1变量。因此,所有变量都持有同一个类的对象。
答案 2 :(得分:0)
从PHP 5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,它们会保存一个标识符的副本,该标识符指向同一个对象。 $ this是对调用对象的引用。在你的情况下当你返回$ this时,你将返回对象$ bar的引用 $ a,$ b和$ c持有标识符$ bar的副本。