PHP nasıl bir nesnenin bir kopyasını oluşturmak mı?

6 Cevap php

PHP nesneleri referans geçirildi anlaşılmaktadır. Hatta atama operatörleri Nesne bir kopyasını oluşturma gibi görünmüyor.

Burada basit, yapmacık kanıtıdır:

<?php

class A {
    public $b;
}


function set_b($obj) { $obj->b = "after"; }

$a = new A();
$a->b = "before";
$c = $a; //i would especially expect this to create a copy.

set_b($a);

print $a->b; //i would expect this to show 'before'
print $c->b; //i would ESPECIALLY expect this to show 'before'

?>

'Sonra' iki yazıcı durumda ben alıyorum

Yani, nasıl başvuruya göre değil, $a değerine göre *set_b()* geçmek istiyorsun?

6 Cevap

PHP 5 + nesnelerine başvuru tarafından geçirilir. PHP 4 onlar (o kalktı oldu ki, referans zamanı geçmek vardı neden olduğunu) değeri tarafından geçirilir.

Nesneleri kopyalamak için PHP5 'klon' operatörünü kullanabilirsiniz:

$objectB = clone $objectA;

Ayrıca, size söz söylediğim gibi referans, her şey geçirilir sadece nesneler değil ...

Cevaplar genellikle Java kitaplarında bulunur.

  1. cloning: If you don't override clone method, the default behavior is shallow copy. If your objects have only primitive member variables, it's totally ok. But in a typeless language with another object as member variables, it's a headache.

  2. serileştirme / seri kaldırma

$ New_object = unserialize (serialize ($ your_object))

Bu, nesnenin karmaşıklığına bağlı olarak ağır bir maliyetle derin bir kopyasını elde edilir.

Eğer bir üye değişkeni olarak başka bir nesne varsa önceki açıklamaya göre, aşağıdakileri yapın:

class MyClass {
  private $someObject;

  public function __construct() {
    $this->someObject = new SomeClass();
  }

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

}

Şimdi klonlama yapabilirsiniz:

$bar = new MyClass();
$foo = clone $bar;

Docs göre (http://ca3.php.net/language.oop5.cloning):

$a = clone $b;

Bu kod yardım klon yöntemleri

class Foo{

    private $run=10;
    public $foo=array(2,array(2,8));
    public function hoo(){return 5;}


    public function __clone(){

        $this->boo=function(){$this->hoo();};

    }
}
$obj=new Foo;

$news=  clone $obj;
var_dump($news->hoo());

Tam farklı bir örnek bir nesnenin özelliklerini kopyalamak isterseniz, bu tekniği kullanmak isteyebilirsiniz:

http://spicr.net/dx_nunez/?p=32

Temelde JSON serialize ve sonra Nesne geri de-serialize.