Variabel salin php tanpa referensi

Penafian. Maksud dari posting blog ini bukan agar Anda berhenti menggunakan kata kunci clone tetapi untuk meningkatkan kesadaran akan perilakunya karena IMO dalam dokumentasi tidak begitu jelas

Seperti yang Anda ketahui, PHP memiliki kata kunci tiruan terkenal yang menyalin semua properti objek secara dangkal. Jadi di balik tudung apa yang dilakukannya adalah membuat Objek baru dengan nilai yang sama persis dari properti objek tersebut – kecuali jika Anda mengubah perilakunya dengan mengimplementasikan fungsi __clone() di kelas Anda

Perilaku ini tampaknya seperti yang kami harapkan. Namun, ini mungkin memberikan hasil yang "aneh" jika objek yang Anda kloning berisi properti yang merupakan objek. Ayo lihat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php

final class Car {
    public $model; // making them public to write less code

    public function __construct(CarModel $model) {
        $this->model = $model;
    } 
}

final class CarModel {
    public $name;
    public $year;
    
    public function __construct($name, $year) {
        $this->name = $name;
        $this->year = $year;
    }
}

Jadi ini adalah dua kelas sederhana, satu untuk Mobil saya, satu lagi untuk Modelnya. Jadi sekarang mari kita lihat apa yang terjadi saat kita membuat Mobil baru, mengkloningnya, dan mengubah nama model salah satunya

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

$bmwX1 = new Car(new CarModel('X1', 2015));
$bmwX5 = clone $bmwX1;

var_dump(spl_object_hash($bmwX1)); // "0000000037e353af0000558c268309ea"
var_dump(spl_object_hash($bmwX5)); // "0000000037e353ac0000558c268309ea"

// So far all good, two objects with different ids.
// Let's see what happens to the model property in those objects

var_dump(spl_object_hash($bmwX1->model)); // "0000000037e353ad0000558c268309ea"
var_dump(spl_object_hash($bmwX5->model)); // "0000000037e353ad0000558c268309ea"

// As you can see the Model object in both objects has the same Id.
// This means if I change the model name in one of the objects it will be reflected in both.

$bmwX5->model->name = 'X5';

var_dump($bmwX1->model);

// object(CarModel)#2 (2) {
//   ["name"]=> "X5"
//   ["year"]=> int(2015)
// }

var_dump($bmwX5->model);

// object(CarModel)#2 (2) {
//   ["name"]=> "X5"
//   ["year"]=> int(2015)
// }

Apakah Anda mengharapkan hasil ini? . Jadi apa yang terjadi di sini? . Jadi bagaimana kita bisa menyelesaikan ini? . Lib DeepCopy adalah yang kami butuhkan. Apa yang dilakukan DeepCopy adalah secara rekursif melintasi semua properti objek dan mengkloningnya untuk memastikan bahwa setiap objek di dalam objek yang Anda kloning memiliki instance baru sehingga ia akan memiliki ID objek baru. Mari kita lihat representasi visual tentang cara kerja clone dan DeepCopy

Bagaimana Anda menyalin data tanpa referensi?

Anda cukup menggunakan copy = Object. buat(Obj asli); . mengurai (JSON. merangkai(Obj asli)); . .
javascript
obyek

Bagaimana cara mengkloning variabel di PHP?

Kata kunci tiruan PHP .
Membuat salinan objek. kelas Kelasku { publik $warna; .
Buat salinan objek yang memiliki referensi. kelas Kelasku { publik $jumlah; .
Gunakan metode __clone() untuk memecahkan referensi dalam objek yang disalin. kelas Kelasku { publik $jumlah;

Bagaimana cara menyalin objek dalam PHP?

Bagaimana cara menyalin string di PHP?

PHP copy() Fungsi . echo copy("source. txt","target. txt");