代码之家  ›  专栏  ›  技术社区  ›  Doug T.

在这种情况下,为什么PHP赋值运算符充当引用赋值?

  •  1
  • Doug T.  · 技术社区  · 14 年前

    我有一些代码在PHP4和PHP5之间表现出不同的行为。此代码如下所示:

    class CFoo
    {
        var $arr;
    
        function CFoo()
        {
            $this->arr = array();
        }
    
        function AddToArray($i)
        {
            $this->arr[] = $i;
        }
    
        function DoStuffOnFoo()
        {
            for ($i = 0; $i < 10; ++$i)
            {
                $foo2 = new CFoo();
                $foo2 = $this;          // I expect this to copy, therefore
                                        // resetting back to the original $this
                $foo2->AddToArray($i);
                echo "Foo2:\n";
                print_r($foo2);
                echo "This:\n";
                print_r($this);
            }
        }
    }
    
    $foo1 = new CFoo();
    $foo1->DoStuffOnFoo();
    

    以前,在PHP4中,上述$foo2的赋值会将$foo2重置回$this最初设置的值。在本例中,我希望将其设置为带有空$arr成员的CFoo。但是,$foo2到$this的赋值是通过引用进行的赋值。Foo2充当此的别名。因此,当我在foo2上调用“AddToArray”时,$arr的$arr也被附加到了后面。因此,当我将foo2重新分配回这个值时,我得到的不是这个值的初始值,而是一个自赋值。

    这种行为在PHP5中发生了变化吗?我该怎么做才能强迫foo2复制这个?

    4 回复  |  直到 8 年前
        1
  •  3
  •   Peter Mortensen John Conde    8 年前

    PHP的面向对象部分已经得到了极大的发展 overhauled in PHP 5 not exactly but almost )作为参考。看见 http://docs.php.net/clone

    $x1 = new StdClass;
    $x1->a = 'x1a';
    
    $x2 = $x1;
    $y = clone $x1;
    
    // Performing operations on x2 affects x1 / same underlying object
    $x2->a = 'x2A';
    $x2->b = 'x2B';
    
    // y is a clone / changes do not affect x1
    $y->b = 'yB';
    
    echo 'x1: '; print_r($x1);
    echo 'y:'; print_r($y);
    

    印刷品

    x1: stdClass Object
    (
        [a] => x2A
        [b] => x2B
    )
    y:stdClass Object
    (
        [a] => x1a
        [b] => yB
    )
    
        2
  •  3
  •   Peter Mortensen John Conde    8 年前

    那么分配之后呢, $this $foo2 , $foo2 指向 美元这个 而不是一份新的 CFoo .

    clone $this .

    在这两种情况下,前一个 new 声明是浪费的。

        3
  •  2
  •   Peter Mortensen John Conde    8 年前

    PHP 5 正在通过引用进行复制。现在你必须 clone 要复制它的对象。

        4
  •  1
  •   Peter Mortensen John Conde    8 年前

    $copy = clone $object;