PHP bir nesne kopyalama nasıl?

5 Cevap php

Ben basit bir 'boyutlarınızın bir genişlik / yükseklik özelliği içeren sınıf ve bunları ayarlamak için bir kurucuya sahip.

Ben nesneleri iki boyutu alır bir işlevi (re-boy ölçüleri) var - bir yeniden-ölçekli ve maksimum boyutu içeren biri. Onlar ikinci parametre 'uyması' gibi ilk parametresinde boyutlarını azaltmak gerekir.

Daha sonra, birinci, yeni yeniden boyutlandırılmış bir döner.

Arayan ölçüleri içinde itiraz geçer ve farklı bir birine dönüş değeri alır - bu orijinal nesneyi korumak için vardır çünkü. Fakat fonksiyon geçirilen bir değiştirilmiş olur.

Ben referans olarak almadım çünkü bu şaşırtıcı oldu:

private function scale_image_dimensions(Dimensions $dimensions, Dimensions $max_size) {

    if( $dimensions->width > $max_size->width ) {
        $dimensions->height = $dimensions->height / ($dimensions->width / $max_size->width);
        $dimensions->width = $max_size->width;
    }

    if( $dimensions->height > $max_size->height ) {
        $dimensions->width = $dimensions->width / ($dimensions->height / $max_size->height);
        $dimensions->height = $max_size->height;
    }

    return $dimensions;
}

Nasıl ben işlevi içine geçirilen nesnelerin bir kopyasını yapmak istediğinizi belirtin ve sonra bunlardan birini iade edebilirim?

update

Ben fonksiyonunun başında $dimensions = $adimensions $adimensions için $dimensions den savını değiştirdi, ve koyun - başka bir şey balık görünüyor.

Ancak arayanın değişken still değiştirilmiş olur! Ayrıca referans atama çalışır mı? Yani ... Bir atama operatörü aşırı veya kopya kurucu yani ... Ben ne yapmalıyım yapmak için olmayan bir yolu yok mu? Ben bir kopyasını istiyorsanız ben açıkça bir every time başlatmak zorunda?

5 Cevap

Birçok kişi tamamen karşı cloning, tüm it için ben olduğumuzu düşündüm.

Düzenleme: Nesne referansı tarafından atanan ve aynı zamanda referans geçirilir.

Eğer bir nesnenin derin bir kopyası gerekiyorsa, $cloned = clone $dimensions gibi klon anahtar sözcüğünü kullanın ve aynı zamanda sağlamak için Dimensions sınıfında sihirli yöntemi __clone() tanımlamak Dimensions içinde herhangi bir nesne referansları gerçekten de klonlandı.

Tüm nesneler, varsayılan olarak, referans olarak adlandırılır. Nesnenin bir kopyasını yapmak için, klon anahtar sözcüğünü kullanarak klonlamak gerekir.

private function scale_image_dimensions(Dimensions $dimensions, Dimensions $max_size) {
    $old_dimensions = $dimensions;
    $dimensions = clone $dimensions;

    if( $dimensions->width > $max_size->width ) {
        $dimensions->height = $dimensions->height / ($dimensions->width / $max_size->width);
        $dimensions->width = $max_size->width;
    }

    if( $dimensions->height > $max_size->height ) {
        $dimensions->width = $dimensions->width / ($dimensions->height / $max_size->height);
        $dimensions->height = $max_size->height;
    }

    return $dimensions;
}

Bu nesnelerin büyük miktarda yapma, ve genellikle insanlar nesneleri zaten referansla geçirilecek istediğiniz PHP'nin tutar.

Diziler genellikle sadece iyi çalışır çünkü PHP Sınıflar çok sık, bir 'Veri depolama' programı olarak kullanılmaz.

Veri depolamak için birçok sınıflarını kullanıyor başka bir dil için geliyor Ama, eğer, ben bu büyük bir sorun olacağını görebilirsiniz.

the clone keyword aradığınız ne olabilir?

$return_dimensions = clone $dimensions;

PHP5 otomatik referans olarak params'ı işler. Sen klon anahtar sözcüğünü kullanarak nesne klonlama olabilir.

$newObject = clone $originalObject;

Klonlama ne zaman endişe gereken bir şey tam bir kopyasını ve sığ kopya arasındaki farktır. Varsayılan olarak, klon sadece yüzeysel bir kopyasını yapacaktır.

Orijinali etkilemeden $ boyutlarını atayabilirsiniz beri parametreleri, değere göre iletilmiş bir anlamda, vardır.

Ancak nesne değişkenleri kendi üye değişkenleri değiştirerek orijinal nesneyi etkiler bu doğru, o yüzden sadece, gerçek nesneye değineği vardır.

Bunu önlemek istiyorsanız, nesneleri klonlamak gerekir. PHP cloning özelliği vardır, ancak varsayılan olarak sığ kopyalarını yapar unutmayın. Lütfen nesneler diğer nesneleri içeriyorsa Yani, bu klonları almazsınız; Sadece asıllarına başvuruyor. Sadece elle kendiniz yeni nesneler oluşturmak ve onların değerlerini kopyalamak isteyebilirsiniz.