1

我有一些代码在 PHP 4 和 PHP 5 之间的行为似乎有所不同。下面的代码:

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();

以前,在 PHP 4 中,上面对 $foo2 的赋值会将 $foo2 重置为 $this 最初设置的值。在这种情况下,我希望它被设置为具有空 $arr 成员的 CFoo。但是,$foo2 对 $this 的赋值是作为引用赋值。Foo2 是这个的别名。因此,当我在 foo2 上调用“AddToArray”时,$this 的 $arr 也被附加到。因此,当我将 foo2 重新分配回 this 时,我并没有得到 this 的初始值,而是得到了一个自赋值。

这种行为在 PHP 5 中改变了吗?我能做些什么来强制 foo2 复制这个?

4

4 回答 4

3

在 PHP 4 中,除非您通过引用(使用 &=)分配对象,否则复制对象。在 PHP 5 中,分配了对该对象的引用。

所以在分配$this给之后$foo2$foo2指向$this而不是指向 的新副本CFoo

要在 PHP 5 中制作副本,您会说clone $this.

在任何一种情况下,前面的new语句都是浪费的。

于 2010-02-12T14:17:06.453 回答
3

PHP 的面向对象部分在 PHP 5 中得到了彻底的改进。对象现在作为引用传递(不完全但几乎)。请参阅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
)
于 2010-02-12T14:17:37.940 回答
2

是的,PHP 5现在是通过引用复制的。现在您必须克隆对象以复制它。

于 2010-02-12T14:23:13.077 回答
1

PHP 从版本 5 开始使用引用。要复制对象,请使用:

$copy = clone $object;
于 2010-02-12T14:20:07.840 回答