分配给变量后,PHP类属性会发生变化

时间:2013-05-15 11:58:39

标签: php class variables properties

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

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文档的链接,其中包含了这些内容。

谢谢。

3 个答案:

答案 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的副本。

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