-2

クラスオブジェクトのコピーを作成するために __clone() を使用したいのですが、その後、そのコピーオブジェクトを印刷したいと考えています。コードは次のとおりです。

<?php
class Test {

    public static $counter = 0;
    public $id;
    public $other;


    public function __construct(){ 
       $this->id = self::$counter++;

    }

    public function __clone()
    {
       $this->other = $that->other;
       $this->id = self::$counter++;
    }
}

$obj = new Test();
$copy = clone $obj;
print_r($copy);
?>
4

2 に答える 2

3

それ以外の

$copy = $obj->__clone();

使用する必要があります

$copy = clone $obj;

呼び出すと__clone()メソッドが呼び出されますclone

于 2013-07-25T12:30:12.293 に答える
2

まず、オブジェクトの__cloneメソッドを直接呼び出してオブジェクトを複製することはありません。clone次のような言語構造を使用する必要があります。

$new = clone $old;

オブジェクトが複製された後、__clone追加の作業を行うためにメソッドが呼び出されます。

注意事項: PHP では、オブジェクトは参照によって割り当てられます。これが意味することは、オブジェクトAを指す変数を持つオブジェクトを複製すると、元のオブジェクトBを変更するBと複製に影響し、その逆も同様です。

この__clone方法を使用すると、クローンが発生したときに反応できるため、適切にクローンBを作成することもできます。このような:

class B { }

class A {
    public $b;

    public function __construct() {
        $this->b = new B();
    }

    public function __clone() {
        $this->b = clone $b;
    }
}

$a = new A();
$c = clone $a;

// now you can safely modify $c->b without worrying about $a->b

このネスティングは、コピーを受け取るのと同じくらい深くする必要があることに注意してください。それ以外のものは参照によってコピーされ、後で頭痛の種になる可能性があります。一般的な経験則: クローンには注意してください。

于 2013-07-25T12:30:30.980 に答える