Hikayeler

Reklam vermek için turkmmo@gmail.com

PHP - Nesneleri Klonlama

Carissa

Administrator
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye Turkmmo Discord Nitro Booster
Admin
Katılım
2 Mar 2015
Konular
59,185
Mesajlar
88,383
Online süresi
4ay 14g
Reaksiyon Skoru
14,227
Altın Konu
2,398
Başarım Puanı
1,051
TM Yaşı
11 Yıl 1 Ay 21 Gün
MmoLira
694,336
DevLira
234

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

maxresdefault (1).jpg


"$obj1 = $obj2" gibi bir PHP ifadesi yalnızca bellekte aynı nesneye başka bir referans oluşturur. Bu nedenle, öznitelikteki değişiklikler hem orijinal hem de kopya nesnede yansır. PHP'deki clone anahtar sözcüğü bir nesnenin yüzeysel bir kopyasını oluşturur.


Orijinal nesnede meydana gelen değişiklikler yüzeysel kopyaya yansımaz.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   class foo {
      var $var1 = 'Hello';
   }
   $x = new foo();
   $y = $x;        # reference copy
   echo $x->var1 . " " . $y->var1 . PHP_EOL;

   $x->var1 = "Hello World";
   echo $x->var1 . " " . $y->var1 . PHP_EOL;
?>

Aşağıdaki çıktıyı üretecektir:

Hello Hello
Hello World Hello World

İlk durumda, $y $x'in sadece bir referans kopyasıdır . Bu nedenle, var1 özelliğindeki herhangi bir değişiklik her ikisine de yansır.

Ancak, $y'yi $x'in bir klonu olarak bildirirsek , orijinal nesnedeki herhangi bir değişiklik onun yüzeysel kopyasına yansımaz.


Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   class foo {
      var $var1 = 'Hello World';
   }

   $x = new foo();

   # shallow copy
   $y = clone $x;
   echo $x->var1 . " " . $y->var1 . PHP_EOL;

   $x->var1 = "Hello PHP";
   echo $x->var1 . " " . $y->var1 . PHP_EOL;
?>

Aşağıdaki çıktıyı üretecektir:

Hello World Hello World
Hello PHP Hello World

Örnek

Aşağıdaki kodda, myclass, adres sınıfının nesnesi olarak niteliklerden birine sahiptir. myclass'ın bir nesnesi atama yoluyla çoğaltılır. Gömülü adres nesnesinin değerindeki herhangi bir değişiklik her iki nesneye de yansıtılır, ancak name özelliğindeki değişiklik klonlanmış nesnede etkilenmez.

PHP:
<?php
   class address {
      var $city="Nanded";
      var $pin="431601";
      function setaddr($arg1, $arg2) {
         $this->city=$arg1;
         $this->pin=$arg2;
      }
   }
   class myclass {
      var $name="Raja";
      var $obj;
      function setname($arg) {
         $this->name=$arg;
      }
   }

   $obj1=new myclass();
   $obj1->obj=new address();
   echo "original object\n";
   print_r($obj1);
   echo "\n";

   $obj2=$obj1;        # reference copy
   $obj1->setname("Ravi");
   $obj1->obj->setaddr("Mumbai", "400001");
   echo "after change: Original object\n";
   print_r($obj1);
   echo "\nCopied object\n";
   print_r($obj2);
?>

Aşağıdaki çıktıyı üretecektir:

original object
myclass Object
(
[name] => Raja
[obj] => address Object
(
[city] => Nanded
[pin] => 431601
)
)

after change: Original object
myclass Object
(
[name] => Ravi
[obj] => address Object
(
[city] => Mumbai
[pin] => 400001
)
)

Copied object
myclass Object
(
[name] => Ravi
[obj] => address Object
(
[city] => Mumbai
[pin] => 400001
)
)

"Klon" Anahtar Kelimesini Kullanma

Sığ bir kopyada, orijinal nesnenin diğer değişkenlere referans olan tüm özellikleri referans olarak kalacaktır. Clone anahtar sözcüğü kopyalanan nesnelerin içerdiği nesneleri kopyalamaz.

Şimdi myclass nesnesinin bir klonunu oluşturuyoruz, böylece $obj2 , $obj1'in klonu oluyor . $obj1'in name özelliğini Raja'dan Ravi'ye değiştiriyoruz ve ayrıca gömülü adres nesnesini de değiştiriyoruz. Özellik değişikliği klonuna yansımayacak, ancak başvurulan adres nesnesi değişecek.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   class address {
      var $city="Nanded";
      var $pin="431601";
      function setaddr($arg1, $arg2) {
         $this->city=$arg1;
         $this->pin=$arg2;
      }
   }
   class myclass {
      var $name="Raja";
      var $obj;
      function setname($arg) {
         $this->name=$arg;
      }
   }
   $obj1=new myclass();
   $obj1->obj=new address();
   echo "original object\n";
   print_r($obj1);
   echo "\n";

   $obj2=clone $obj1;        # clone copy
   $obj1->setname("Ravi");
   $obj1->obj->setaddr("Mumbai", "400001");
   echo "after change: Original object\n";
   print_r($obj1);
   echo "\nCopied object\n";
   print_r($obj2);
?>

Aşağıdaki çıktıyı üretecektir:

original object
myclass Object
(
[name] => Raja
[obj] => address Object
(
[city] => Nanded
[pin] => 431601
)
)

after change: Original object
myclass Object
(
[name] => Ravi
[obj] => address Object
(
[city] => Mumbai
[pin] => 400001
)
)

Copied object
myclass Object
(
[name] => Raja
[obj] => address Object
(
[city] => Mumbai
[pin] => 400001
)
)

__clone() Yöntemini Kullanma

Clone anahtar sözcüğü nesnenin yüzeysel bir kopyasını oluşturur. Bir nesne klonlandığında, PHP nesnenin tüm özelliklerinin yüzeysel bir kopyasını gerçekleştirir. Diğer değişkenlere referans olan tüm özellikler referans olarak kalır. Bu nedenle, orijinal nesnede yapılan tüm değişiklikler klonlanan nesnede de görünür.

Kopyalanan nesnenin otomatik olarak güncellenmesini engellemek istiyorsanız, __clone() metoduyla nesnenin derin bir kopyasını oluşturmamız gerekir. Bu PHP'deki sihirli metotlardan biridir.

Klonlama tamamlandıktan sonra, bir __clone() metodu tanımlanırsa, değiştirilmesi gereken gerekli özelliklere izin vermek için yeni oluşturulan nesnenin __clone() metodu çağrılır.

Örnek

Yukarıdaki örnekte, myclass'ın bir nesnesi var, onun niteliklerinden biri olan $obj, adres sınıfındaki bir nesneye referansı tutuyor. Derin bir kopya elde etmek için, myclass'taki __clone() sihirli yöntemini geçersiz kılıyoruz.

PHP:
<?php
   class address {
      var $city="Nanded";
      var $pin="431601";
      function setaddr($arg1, $arg2) {
         $this->city=$arg1;
         $this->pin=$arg2;
      }
   }
   class myclass {
      var $name="Raja";
      var $obj;
      function setname($arg) {
         $this->name=$arg;
      }
      public function __clone() {
         $this->obj = clone $this->obj ;
      }
   }
   $obj1=new myclass();
   $obj1->obj=new address();
   echo "original object\n";
   print_r($obj1);
   echo "\n";

   $obj2=clone $obj1;        # cloned deep copy
   $obj1->setname("Ravi");
   $obj1->obj->setaddr("Mumbai", "400001");
   echo "after change: Original object\n";
   print_r($obj1);
   echo "\nCloned object\n";
   print_r($obj2);
?>

Artık orijinal nesnedeki değişikliklerin (adres niteliklerini değiştiriyoruz) klonlanmış nesneye yansımayacağını göreceksiniz, aşağıdaki çıktı bunu gösteriyor:

original object
myclass Object
(
[name] => Raja
[obj] => address Object
(
[city] => Nanded
[pin] => 431601
)
)

after change: Original object
myclass Object
(
[name] => Ravi
[obj] => address Object
(
[city] => Mumbai
[pin] => 400001
)
)

Cloned object
myclass Object
(
[name] => Raja
[obj] => address Object
(
[city] => Nanded
[pin] => 431601
)
)
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst