Kuasa dan bahaya rujukan PHP: Memahami simbol `&`
Jul 26, 2025 am 09:46 AMRujukan PHP, yang dilambangkan oleh &, membuat alias kepada pembolehubah, yang membolehkan pengubahsuaian dua hala nilai yang sama; 1. }; 2. 3. Mereka boleh dikembalikan dari kaedah untuk akses langsung, walaupun ini jarang dan maju; Walau bagaimanapun, mereka memperkenalkan risiko: kebocoran yang tidak disengajakan dalam gelung menyebabkan penindasan yang tidak diingini, array dengan rujukan berkelakuan tidak konsisten, dan debugging menjadi lebih sukar disebabkan oleh kesan sampingan yang tidak kelihatan; Amalan terbaik termasuk mengelakkan rujukan melainkan perlu, rujukan gelung yang tidak dapat diselesaikan, menggunakan objek sebaliknya kerana ia secara semulajadi diluluskan dengan rujukan, dan memilih nilai pulangan ke atas pengubahsuaian parameter untuk penggunaan kod yang lebih bersih, lebih diramalkan dengan berhati -hati dan mengutamakan kejelasan.
The &
simbol dalam php-innocent-cooking, tetapi mampu menjatuhkan pemaju yang berpengalaman. Ia bukan aritmetik atau bitwise di sini; Ini mengenai rujukan . Digunakan dengan bijak, ia boleh menjadikan kod cekap dan elegan. Disalahgunakan, ia membawa kepada bug yang mengelirukan dan tingkah laku yang tidak dapat diramalkan. Mari kita pecahkan apa rujukan PHP sebenarnya, bagaimana mereka bekerja, dan di mana mereka boleh salah.

Apakah rujukan PHP?
Rujukan dalam PHP bukan penunjuk seperti dalam C atau C. Sebaliknya, ia adalah alias -dua nama pembolehubah merujuk kepada nilai asas yang sama. Apabila anda menyerahkan dengan rujukan menggunakan &
, anda memberitahu PHP: "Biarkan pembolehubah ini menunjuk kepada data yang sama seperti yang satu itu."
$ a = 10; $ b = & $ a; // $ B kini merujuk kepada $ a $ b = 20; echo $ a; // output: 20
Di sini, $b
bukan hanya menyalin nilai $a
. Ia berkongsi storan yang sama. Tukar satu, yang lain mencerminkannya.

Mata Utama:
- Rujukan adalah dua hala .
- Mereka diselesaikan semasa runtime , tidak menyusun masa.
- Mereka hanya bekerja dengan pembolehubah, bukan ekspresi atau literal.
Kes penggunaan biasa untuk rujukan
Walaupun PHP mengendalikan kebanyakan data menyalin dengan cekap (terima kasih kepada salinan-on-write), terdapat senario yang sah di mana rujukan bersinar.

1. Mengubah pembolehubah di dalam fungsi
Anda boleh menggunakan rujukan untuk membiarkan fungsi mengubah suai pemboleh ubah asal, bukan hanya satu salinan.
Peningkatan fungsi (& $ num) { $ num; } $ Count = 5; kenaikan ($ Count); echo $ count; // output: 6
Ini berguna untuk fungsi yang perlu mengembalikan pelbagai nilai melalui parameter (walaupun array yang kembali sering bersih).
2. Looping dengan foreach
dengan rujukan
Apabila anda perlu mengubah suai elemen array semasa lelaran:
$ item = [1, 2, 3]; foreach ($ item as & $ item) { $ item *= 2; } // $ item sekarang [2, 4, 6]
Tanpa &
, anda hanya mengubah suai salinan setiap nilai, meninggalkan array asal tidak berubah.
?? Tetapi berhati -hati: lupa untuk tidak menyaksikan rujukan selepas gelung boleh menyebabkan hasil yang tidak dijangka dalam gelung berikutnya.
foreach ($ item as & $ item) { / * ... * /} unset ($ item); // penting! Jika tidak $ item masih merujuk elemen terakhir
3. Mengembalikan rujukan dari fungsi
Jarang, tetapi kadang -kadang digunakan dalam antara muka fasih atau apabila anda memerlukan akses langsung ke pemboleh ubah dalaman.
bekas kelas { $ data peribadi = []; Fungsi Awam & GetRef ($ Key) { kembali $ this-> data [$ key]; } } $ obj = bekas baru (); $ obj-> data ['x'] = 'original'; $ ref = & $ obj-> getRef ('x'); $ ref = 'Modified'; echo $ obj-> data ['x']; // output: diubahsuai
Ini adalah kod yang lebih maju -kebanyakan kod tidak memerlukannya.
Perils: Di mana rujukan salah
Rujukan berkuasa, tetapi mereka memperkenalkan kesan sampingan dan mengurangkan ramalan kod.
1. Kebocoran rujukan yang tidak disengajakan
Ini adalah perangkap klasik dengan foreach
:
$ arr1 = [1, 2, 3]; $ arr2 = [4, 5, 6]; foreach ($ arr1 as & $ value) {} foreach ($ arr2 as $ value) {} // $ nilai masih rujukan! print_r ($ arr2); // mungkin menunjukkan [4, 5, 5] - Nilai terakhir mendapat ditimpa
Kerana $value
masih merujuk kepada elemen terakhir $arr1
, menyerahkannya dalam gelung kedua mengubah elemen terakhir. Sentiasa unset()
pembolehubah rujukan selepas gelung.
2. Tingkah laku yang mengelirukan dengan tatasusunan
Array yang mengandungi rujukan berkelakuan berbeza daripada yang diharapkan:
$ a = 10; $ b = [$ a]; $ c = & $ a; $ b [0]; // $ A masih 10, $ b [0] adalah 11 echo $ a; // 10 $ d = 20; $ e = [& $ d]; $ d; // $ d ialah 21 echo $ e [0]; // 21 - Kerana itu rujukan
Sekarang elemen array mencerminkan perubahan kepada pemboleh ubah asal. Ketidakkonsistenan ini boleh mengelirukan.
3. Debugging Headaches
Apabila pembolehubah secara misteri berubah, rujukan sering menjadi penyebabnya. Oleh kerana tidak ada cara terbina dalam untuk memeriksa sama ada pembolehubah adalah rujukan (kecuali melalui debug_zval_dump()
), mengesan sumber mutasi boleh menyakitkan.
Amalan dan alternatif terbaik
- Elakkan rujukan melainkan perlu. Kebanyakan masalah boleh diselesaikan dengan nilai pulangan atau reka bentuk berorientasikan objek.
- Sentiasa
unset()
pembolehubah rujukan selepas gelungforeach
. - Gunakan objek sebaliknya -sifat objek secara semulajadi diluluskan oleh rujukan (dalam PHP moden).
- Lebih suka mengembalikan nilai ke atas mengubahsuai parameter.
Bukannya:
Format FormatName (& $ nama) { $ name = trim (Ucwords ($ name)); }
Lakukan:
Format FormatName ($ nama) { kembali trim (Ucwords ($ nama))); } $ name = formatName ($ name);
Bersih, boleh diramal, dan lebih mudah untuk diuji.
Rujukan dalam PHP adalah seperti pisau dapur: penting di tangan kanan, berbahaya jika disalahgunakan. Mereka menyelesaikan masalah sebenar-terutamanya dalam kod prestasi kritikal atau warisan-tetapi memperkenalkan kerumitan. Ketahui bila menggunakannya, dan bila hendak pergi.
Pada asasnya: Gunakan dengan berhati -hati, bersihkan diri anda, dan nikmat kejelasan atas kepandaian.
Atas ialah kandungan terperinci Kuasa dan bahaya rujukan PHP: Memahami simbol `&`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Passbyvalueansacopyofthedataispassed, sochangesinsidethefunctiondonotaffectheoriginalvariable, asseenincwithprimitivesorpythonwithimmutableTypes.2.PassbyReferenceMeansTheFiStiveAnceAceAceFefereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereFereNeriveigineReferin

TypedpropertiesInphp7.4 AllowDirectTypedeClarationforcoRproperties, InfrovingReliability, idesupport, andcodeclarity;

Pembolehubah pembolehubah menggunakan nilai satu pembolehubah sebagai nama pembolehubah lain melalui sintaks $$ var; 2. Sebagai contoh, apabila $ myvar adalah "hello", $$ myvar bersamaan dengan $ hello dan boleh diberikan nilai; 3. 4. Terdapat masalah seperti kebolehbacaan yang lemah, risiko keselamatan yang tinggi, dan mengganggu analisis statik, terutamanya mengelakkan penggunaan $$ untuk input pengguna; 5. Adalah disyorkan untuk menggunakan tatasusunan atau objek dan bukannya membuat pembolehubah dinamik, seperti menyimpan data ke dalam array data $ dan bukannya membuat pembolehubah dinamik; 6. Menggunakan $ {$ var} sintaks Curly Brace dapat meningkatkan kejelasan kod, terutama dalam senario kompleks. Perubahan berubah

DielakkanTheglobalkeywordswordoWorderararyasitleadstocodethatishardertotest, debug, danmaintain;

Aphpvariable'slifecycleCycleBeginSwithmemoryAllocationViazValcreation, whitstoresthevalue, type, referenceCount, andReferenceflag.2.WhenvariablesareasSignedorshared, phpusesRefereCoNtingandcopy-on-writeStimeMemoryStimeMem

PhpSuperglobalsinclude $ _get, $ _ post, $ _ permintaan, $ _ sesi, $ _ cookie, $ _ server, $ _ files, $ _ env, dan $ globals, eachservingdistinctpurpose sbeyondjusthandlingformdata; theenableStateManagement, ServerIntionAction, andenvironmentaccess.1. $ _ RequestCombines $ _get, $ _ Post,

Constantscannotbechangedafterdefinition, whilevariablescan; 1.variablesstartwith $, boleh diasingkan, scoped, andidealfordynamicdata;

isset () checksifavariableisdeclaredandnotnull, returningToremptyStrings, 0, '0', false, andemptyArrays; useittoconfirmariablexistsandhasbeenset, sucverifyingformInputSike $ _post ['e-mel']
