【问题标题】:PHP Class Properties change after assigned to variable分配给变量后PHP类属性发生变化
【发布时间】:2013-05-09 23:41:54
【问题描述】:

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

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 文档的链接,其中涵盖了这一点。

谢谢。

【问题讨论】:

    标签: php class variables properties


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      * 但不在“参考”的& 含义中。见http://php.net/manual/en/language.oop5.references.php

      【讨论】:

        【解决方案3】:

        你正在做的是这个

        $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多变的。因此,所有变量都持有相同的类对象。

        【讨论】:

        • 是的,你是对的。我错误地认为 $a 会保留初始化。价值。
        猜你喜欢
        • 2021-09-20
        • 2016-09-27
        • 2021-12-02
        • 1970-01-01
        • 2019-10-29
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多