Nasıl farklı bir nesne türü bir PHP nesneyi kopyalamak yok

5 Cevap php
  1. Yeni sınıf orijinal nesnenin bir alt sınıfıdır

  2. Bu uyumlu php4 gerekiyor

5 Cevap

Sen sınıfları boş örneği ve ardından yöntemlerden herhangi sayısına göre yüklenen olabilir. Bu yöntemlerden biri, bir argüman olarak ana sınıfının bir örneğini kabul ve oradan verileri kopyalamak olabilir

class childClass extends parentClass
{
    function childClass()
    {
        //do nothing
    }

    function loadFromParentObj( $parentObj )
    {
        $this->a = $parentObj->a;
        $this->b = $parentObj->b;
        $this->c = $parentObj->c;
    }
};

$myParent = new parentClass();
$myChild = new childClass();
$myChild->loadFromParentObj( $myParent );

Bir php nesne bir dizi için bir sürü farklı değildir, ve tüm PHP 4 nesne değişkenleri kamu olduğundan, bu gibi bazı dağınık şeyler yapabilirsiniz:

function clone($object, $class)
{
     $new = new $class();
     foreach ($object as $key => $value)
     {
          $new->$key = $value;
     }
     return $new;
}
$mySubclassObject = clone($myObject, 'mySubclass');

Onun güzel, değil onun certianly değil ne iyi uygulama olarak kabul ediyorum, ama is yeniden ve oldukça temiz.

Iyi yöntem yapabileceğini böylece Altsınıf bir klon yöntemi oluşturmak olacaktır:

$myvar = $subclass->clone($originalObject)

Eğer dekoratör desen içine bakmak olabilir gibi alternatif geliyor php example

Ben bir "kopya yapıcı" bir tür icat etmek zorunda olacağını hayal ediyorum. Sonra sadece orijinal nesnenin geçen ederken, yeni bir alt sınıf nesnesi yaratacaktır.

Ben ciddiye why Eğer ilk etapta bu şartı var soru olsa da, bazı kara büyü ile yapabilirsiniz. Bu tasarım ile ciddi yanlış bir şey olduğunu göstermektedir.

Bununla birlikte:

function change_class($object, $new_class) {
  preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches);
  return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1]));
}

Bu, diğer nesneler veya kaynaklara referanslar kayıp anlamına gelir, genel, tefrika gibi aynı sınırlamalara tabidir.