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 をこれに再割り当てしようとすると、これの初期値を取得する代わりに、本質的に自己割り当てが行われます。

この動作は PHP 5 で変更されましたか? foo2 にこれのコピーを強制的に作成させるにはどうすればよいですか?

4

4 に答える 4

3

PHP 4 では、(&= を使用して) 参照によって割り当てない限り、オブジェクトのコピーが作成されました。PHP 5 では、オブジェクトへの参照が割り当てられます。

したがって、 に割り当て$thisた後、 の新しいコピーではなく$foo2、 を$foo2指します。$thisCFoo

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 に答える