Apakah variabel PHP diteruskan oleh nilai atau dengan referensi?
php
variables
pass-by-reference
pass-by-value
cmcculloh
sumber
sumber
Jawaban:
Ini berdasarkan nilai menurut Dokumentasi PHP .
sumber
$str = add_some_extra($str);
jika saya tidak menggunakan referensi, kan? lalu apa nilai tambah nyata dari itu?$str
akan ditugaskan nol, dalam kasus Anda.Dalam PHP, secara default objek dilewatkan sebagai salinan referensi ke objek baru.
Lihat contoh ini .............
Sekarang lihat ini ..............
Sekarang lihat ini ..............
saya harap kamu bisa mengerti ini.
sumber
$y
tidak diperlukan - tidak ada difunction changeValue
dalamnya yang mengharuskannya berada di dalamclass Y
, sehingga menyatukan dua konsep yang tidak terkait. Saya akan pindahfunction changeValue
ke lingkup luar, tepat di atas$x = new X();
. Hapus semua referensi$y
. Sekarang lebih mudah untuk melihat bahwa dua contoh pertama meninggalkan $ x sendirian, dan yang ketiga mengubah isinyanew Y()
. Yang akan lebih mudah untuk melihat apakah Anda membuangtype
dari$x
- fakta bahwa keduaX
danY
terjadi untuk menyertakan$abc
lapangan juga tidak relevan dengan apa yang ditunjukkanTampaknya banyak orang menjadi bingung dengan cara benda dilewatkan ke fungsi dan apa artinya lewat referensi. Variabel objek masih dilewati oleh nilai, hanya saja nilai yang diteruskan dalam PHP5 adalah pegangan referensi. Sebagai bukti:
Keluaran:
Untuk lulus dengan referensi berarti kita dapat memodifikasi variabel yang dilihat oleh pemanggil. Yang jelas kode di atas tidak bisa. Kita perlu mengubah fungsi swap ke:
Keluaran:
untuk melewati referensi.
sumber
swap
fungsi; dengan kata lain, jika objek "dilewati oleh nilai". Di sisi lain, itu juga persis seperti yang Anda harapkan jika sebuah pegangan objek dilewatkan ke fungsi, yang sebenarnya yang terjadi. Kode Anda tidak membedakan antara dua kasus ini.http://www.php.net/manual/en/migration5.oop.php
sumber
Variabel PHP ditugaskan oleh nilai, diteruskan ke fungsi dengan nilai, dan ketika berisi / mewakili objek dilewatkan oleh referensi. Anda dapat memaksa variabel untuk lulus dengan referensi menggunakan &
Ditugaskan oleh nilai / contoh referensi:
akan menghasilkan
Lulus oleh nilai / referensi contoh:
akan menghasilkan:
Variabel objek yang dilewatkan oleh contoh referensi:
Akan menghasilkan:
(contoh terakhir itu mungkin lebih baik ...)
sumber
$foo
adalah pointer ke objek .$foo
adalah lewat nilai ke fungsichangeFoo()
, sepertichangeFoo()
tidak menyatakan parameter yang dengan&
.Anda bisa meneruskan variabel ke fungsi dengan referensi. Fungsi ini akan dapat memodifikasi variabel asli.
Anda dapat mendefinisikan bagian dengan referensi dalam definisi fungsi:
sumber
Anda dapat melakukannya dengan cara apa pun.
letakkan simbol '&' di depan dan variabel yang Anda lewati menjadi satu dan sama dengan asalnya. yaitu: Anda dapat melewati referensi, daripada membuat salinannya.
begitu
sumber
Variabel yang mengandung tipe primitif diteruskan oleh nilai dalam PHP5. Variabel yang berisi objek dilewatkan dengan referensi. Ada artikel yang cukup menarik dari Linux Journal dari 2006 yang menyebutkan ini dan perbedaan OO lainnya antara 4 dan 5.
http://www.linuxjournal.com/article/9170
sumber
&
.Objek dilewatkan dengan referensi dalam PHP 5 dan dengan nilai dalam PHP 4. Variabel dilewatkan oleh nilai secara default!
Baca di sini: http://www.webeks.net/programming/php/ampersand-operator-used-for-assigning-reference.html
sumber
&
.&
di depan parameter dalam definisi - jika mereka diteruskan oleh nilai objek yang terdapat dalam lingkup yang disebut fungsi dengan itu sebagai parameter akan tidak terpengaruh.Atribut masih dapat dimodifikasi ketika tidak dilewati oleh referensi jadi waspadalah.
Keluaran:
SwapObjects: b, a SwapValues: a, b
sumber
Bagi siapa saja yang menemukan ini di masa mendatang, saya ingin membagikan permata ini dari dokumen PHP, yang diposting oleh pengguna anonim :
Dan inilah contoh yang mereka berikan:
Saya menulis posting blog yang luas dan terperinci tentang subjek ini untuk JavaScript , tetapi saya percaya itu berlaku juga untuk PHP, C ++, dan bahasa lain di mana orang-orang tampaknya bingung tentang nilai demi nilai vs per referensi.
Jelas, PHP, seperti C ++, adalah bahasa yang mendukung referensi per referensi. Secara default, objek dilewatkan oleh nilai. Ketika bekerja dengan variabel yang menyimpan objek, ada baiknya untuk melihat variabel-variabel itu sebagai pointer (karena pada dasarnya seperti apa mereka, di tingkat perakitan). Jika Anda melewatkan pointer berdasarkan nilai, Anda masih bisa "melacak" pointer dan memodifikasi properti objek yang ditunjuk. Yang tidak bisa Anda lakukan adalah mengarahkannya ke objek lain. Hanya jika Anda secara eksplisit mendeklarasikan parameter yang dilewatkan oleh referensi Anda akan dapat melakukannya.
sumber
Sebenarnya kedua metode ini valid tetapi tergantung pada kebutuhan Anda. Nilai-nilai kecepatan dengan referensi sering membuat skrip Anda lambat. Jadi lebih baik untuk melewatkan variabel berdasarkan nilai dengan mempertimbangkan waktu eksekusi. Alur kode juga lebih konsisten ketika Anda melewatkan variabel berdasarkan nilai.
sumber
Gunakan ini untuk fungsi ketika Anda hanya ingin mengubah variabel asli dan mengembalikannya ke nama variabel yang sama dengan nilai baru yang ditetapkan.
sumber
Bergantung pada versi, 4 berdasarkan nilai, 5 berdasarkan referensi.
sumber