php Nesne Klonlama nedir?

4 Cevap php

Birisi bana açıklayabilir misiniz

  • php Nesne Klonlama nedir?

  • Ne zaman i php klon kelime kullanmanız gerekir?

4 Cevap

Nesne kopyalama bir nesnenin bir kopyasını yapma eylemidir. Cody belirttiği gibi, PHP klonlama nesne sığ bir kopyasını yaparak yapılır. Bu, açık bir şekilde sihirli yöntemi tanımlayarak, bu da iç nesneleri klonlamak için nesneyi talimat sürece klonlanmış nesnenin iç nesneleri not, klonlanabilir anlamına gelir __clone().

Eğer __clone yöntemini kullanmak istemiyorsanız, yeni nesnenin iç nesneleri klonlandı orijinal nesnenin iç nesneleri olarak bellekte aynı objecs referanslar olacaktır.

Bu örnekleri göz önünde bulundurun:

// in this exampe the internal member $_internalObject of both objects
// reference the same instance of stdClass in memory.
class CloneableClass
{
    private $_internalObject;

    public function __construct()
    {
        // instantiate the internal member
        $this->_internalObject = new stdClass();
    }
}

$classA = new CloneableClass();
$classB = clone $classA;


// in this exampe the internal member $_internalObject of both objects
// DON'T reference the same instance of stdClass in memory, but are inividual instances
class CloneableClass
{
    private $_internalObject;

    public function __construct()
    {
        // instantiate the internal member
        $this->_internalObject = new stdClass();
    }

    // on clone, make a deep copy of this object by cloning internal member;
    public function __clone()
    {
        $this->_internalObject = clone $this->_internalObject;
    }
}

$classA = new CloneableClass();
$classB = clone $classA;

Klonlama için kullanın durumlarda örneğin bir nesnenin iç durumu ile karışıklık dışındaki nesneleri istemediğiniz bir durum olurdu.

Diyelim ki bir iç nesne Adresi ile sınıf Kullanıcı var diyelim.

class Address
{
    private $_street;
    private $_streetIndex;
    private $_city;
    // etc...

    public function __construct( $street, $streetIndex, $city /* etc.. */ )
    {
        /* assign to internal values */
    }
}

class User
{
    // will hold instance of Address
    private $_address;

    public function __construct()
    {
        $this->_address = new Address( 'somestreet', '1', 'somecity' /* etc */ );
    }

    public function getAddress()
    {
        return clone $this->_address;
    }
}

Argümanlar aşkına, size Kullanıcı nesnelerin iç adresi ile karışıklık dışındaki nesneleri istemiyorum diyelim, ama onları Adres nesnenin bir kopyasını vermek mümkün olmak istiyorum. Yukarıdaki örnek bunu göstermektedir. getAddress yöntemi, nesneleri arayarak adres nesnenin bir kopyası döndürür. Bu çağıran nesne Adres nesnesini değiştirir eğer, Kullanıcı iç Adres değiştirmek anlamına gelir. Eğer bir klon vermediler eğer bir başvuru varsayılan değil, bir klon tarafından verilir, çünkü o dış nesne would, Kullanıcı iç Adresini değiştirmek mümkün olacak.

Bu hepsi bazı mantıklı umuyoruz.

PS.:
Be aware though, that if Address would also have internal objects, you would have to make sure Address makes a deep copy of itself on cloning (as per my second example of this post) by defining __clone() in Address. Otherwise you will get headaches of trying to figure out why your data is screwed.

Klonlama bir nesnenin orijinal bir kopyasını oluşturmak için kullanılır. Başka bir değişkene bir nesne atama kopyasını yaratmaz - ziyade, nesne olarak aynı bellek konuma bir başvuru oluşturur:

<?php

$o= new stdclass;
$o->a= 'b';
$o->b= 'c';

$o2= $o;
$o2->a= 'd';

var_dump($o);
var_dump($o2);

$o3= clone $o;
$o3->a= 'e';
var_dump($o);
var_dump($o3);

?>

Bu örnek kod çıktısı şu olacaktır:

object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#1 (2) {
  ["a"]=>
  string(1) "d"
  ["b"]=>
  string(1) "c"
}
object(stdClass)#2 (2) {
  ["a"]=>
  string(1) "e"
  ["b"]=>
  string(1) "c"
}

Nesne Klonlama, PHP 5 açısından, bir "shallow copy" olarak bilinir. Daha sonra nesne klonlanmış olması üzerine __ clone () yöntemini çağırır.

Torun nesnelerin alt nesneler ve klonları yani, klonlar - - Eğer derin bir kopyası gerekiyorsa Ya __clone sınıfların her birinde üzerine yazmak, ya da sadece nesneyi unserialize + serialize:

function deepClone($object)
{
    return unserialize(serialize($object));
}