Backend

PHP İle Nesne Kopyalama Nasıl Yapılır?

Php ile nesne kopyalama işlemi nasıl gerçekleştirilir. __clone() magic metodu ne işe yarar?

Kadir Bay

Developer

Xnapper-2022-07-26-14.09.01-74828431-5619-4B95-9776-017B7260FDFD.png

Php ile bir sınıfın nesnesi oluşturmak istersek new kelimesini kullanmamız gerekir. new Student() ile yeni bir obje oluşturduk. 15.inci satırda $student3'e $student1'i atamış olduk. Aslında ne oldu?

Bellekte Student tipinde 2 adet objenin verileri tutuluyor. Bu verileri erişmek için $student1 ve $student2 isimli iki adet değişken ile erişebiliyoruz. Daha sonra 15.satırda $student3 isimli bir değişken oluşturup $student1'i atadık. Bu durumda hem $student1 hem de $student3 değişkenleri bellekteki aynı obje verisine erişir oldu. Bu da name property'si 'Kadir' olan objedir. Peki aynı değerlere sahip başka bir objeyi nasıl oluşturabiliriz.

"clone" anahtar kelimesi ile. Clone objenin verileri aynı olacak şekilde, bellekte yeni bir alan açıp orada bu yeni objemizin verilerini tutar. Aşağıdaki resimde kodu inceleyebilirsiniz.

Xnapper-2022-07-26-14.30.35-4DAF9E45-56E0-4A0C-8035-F012D51976A1.png

Sadece 15.inci satırda değişiklik yapar "clone" kelimesini kullandık. Çıktıda görüleceği üzere 1.inci ve 3.üncü objeler farklılar. #1 ve #3 olarak konsolda belirtilmiş.

Diyelim ki, bu örnekteki gibi bir kopyalamaya ihtiyaç duyduk. Clone işlemi gerçekleştirerek nesnemizi tüm özellikleri ile birlikte kopyaladık. Bu örnekte de olduğu gibi #1 ve #3 nesleleri birebir kopya oldular ve ikisinin de numaraları 766 oldu. Gerçek hayatta student objesini kopyalamak isteriz ancak $number özelliğini es geçmesini veya değiştirmesini isteriz. Bunun gibi bir durumda yapmamız gereken; __clone() magic methodunu kullanmak. Hadi kodumuzu değiştirelim.

Xnapper-2022-07-26-14.39.25-621D1C96-ACEF-4AD0-A3C0-1C6471D78506.png

12.satırda görüldüğü üzere __clone() magic methodumuzu yazdık. Artık "clone" kelimesi ile bu obje kopyalandığı zaman bu method devreye girecek ve $number özelliğini değiştirecektir. Konsolda #1 nesnesi 986, #3 nesnesi 367 numarasına sahip oldular.

Ayrıca rand() fonksiyonu tekrar tekrar yazılmış oldu. Bunun yerine generateNumber() isimli bir fonksiyon oluşturup, bu fonksiyonu çağırmamız daha doğru olacaktır. Son değişikliği aşağıda resimdeki gibi yaptık.

Xnapper-2022-07-26-14.52.59-0AC1B19C-295B-4175-9EB5-9F0D2B45AE3C.png

Aradığınız partner biz miyiz?

Bize projenden bahset.