PHP dan referensi agak tidak intuitif. Jika digunakan dengan tepat referensi di tempat yang tepat dapat memberikan peningkatan kinerja besar atau menghindari solusi yang sangat buruk dan kode yang tidak biasa.
Berikut ini akan menghasilkan kesalahan:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Tak satu pun dari ini harus gagal karena mereka dapat mengikuti aturan di bawah ini tetapi tidak diragukan lagi telah dihapus atau dinonaktifkan untuk mencegah banyak kebingungan warisan.
Jika mereka berhasil, keduanya melibatkan konversi redundan ke referensi dan yang kedua juga melibatkan konversi redundan kembali ke variabel yang terkandung dalam cakupan.
Yang kedua dulu memungkinkan memungkinkan referensi untuk diteruskan ke kode yang tidak dimaksudkan untuk bekerja dengan referensi. Ini sangat jelek untuk perawatannya.
Ini tidak akan melakukan apa-apa:
function f($v){$v = true;}
$r = &$v;
f($r);
Lebih khusus lagi, ini mengubah referensi kembali menjadi variabel normal karena Anda belum meminta referensi.
Ini akan berhasil:
function f(&$v){$v = true;}
f($v);
Ini melihat bahwa Anda melewati non-referensi tetapi menginginkan referensi sehingga mengubahnya menjadi referensi.
Apa artinya ini adalah bahwa Anda tidak dapat meneruskan referensi ke fungsi di mana referensi tidak secara eksplisit diminta untuk menjadikannya salah satu dari sedikit area di mana PHP ketat pada jenis passing atau dalam hal ini lebih dari tipe meta.
Jika Anda membutuhkan perilaku yang lebih dinamis, ini akan berfungsi:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Di sini terlihat bahwa Anda menginginkan referensi dan sudah memiliki referensi, jadi biarkan saja. Mungkin juga rantai referensi tetapi saya ragu ini.