Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Gelagat Tugasan Mempengaruhi Objek dalam PHP: Nilai vs. Rujukan?

Bagaimanakah Gelagat Tugasan Mempengaruhi Objek dalam PHP: Nilai vs. Rujukan?

Barbara Streisand
Barbara Streisandasal
2024-10-22 07:25:30553semak imbas

How Does Assignment Behavior Affect Objects in PHP: Value vs. Reference?

Memahami Penetapan Objek dalam PHP: Nilai vs. Rujukan

Apabila ia datang kepada penetapan objek dalam PHP, fahami perbezaan antara nilai dan rujukan tingkah laku adalah penting. PHP boleh menetapkan objek sama ada mengikut nilai atau rujukan.

Coretan Kod Asal

Pertimbangkan kod PHP berikut:

<code class="php">class Foo {
    var $value;

    function foo($value) {
        $this->setValue($value);
    }

    function setValue($value) {
        $this->value = $value;
    }
}

class Bar {
    var $foos = array();

    function Bar() {
        for ($x = 1; $x <= 10; $x++) {
            $this->foos[$x] = new Foo("Foo # $x");
        }
    }

    function getFoo($index) {
        return $this->foos[$index];
    }

    function test() {
        $testFoo = $this->getFoo(5);
        $testFoo->setValue("My value has now changed");
    }
}</code>

Soalan: Kelakuan Tugasan

Apabila kaedah Bar::test() dilaksanakan dan menukar nilai foo # 5 dalam tatasusunan objek foo, adakah foo # 5 sebenar dalam tatasusunan akan terjejas , atau adakah pembolehubah $testFoo hanya pembolehubah tempatan yang tidak lagi wujud pada penghujung fungsi?

Jawapan: Tugasan melalui Rujukan

Untuk menentukan tingkah laku , mari kita analisa kod yang diberikan:

<code class="php">$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;</code>

Melaksanakan kod ini menghasilkan output berikut:

Foo #5
My value has now changed

Penjelasan

PHP memperuntukkan objek dengan rujukan secara lalai dalam versi 5. Ini bermakna apabila objek foo # 5 dikembalikan oleh getFoo(), rujukan kepada objek yang sama disimpan dalam pembolehubah $testFoo.

Oleh itu, apabila setValue() kaedah dipanggil pada $testFoo, objek foo # 5 sebenar dalam tatasusunan diubah suai, bukan hanya salinan tempatan. Inilah sebab mengapa nilai foo # 5 berubah walaupun selepas kaedah Bar::test() dilaksanakan.

Nota tentang Tugasan Mengikut Nilai

Jika mahu, anda boleh menetapkan objek mengikut nilai dan bukannya dengan rujukan menggunakan kata kunci klon:

<code class="php">$testFoo = clone $this->getFoo(5);
$testFoo->setValue("My value has now changed");</code>

Atas ialah kandungan terperinci Bagaimanakah Gelagat Tugasan Mempengaruhi Objek dalam PHP: Nilai vs. Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn