Saya punya beberapa pengetahuan C ++ dan tahu bahwa pointer biasanya digunakan di sana, tapi saya sudah mulai melihat kode open source PHP dan saya tidak pernah melihat kode menggunakan referensi dalam metode.
Sebaliknya, kode selalu menggunakan nilai balik alih-alih meneruskan referensi ke variabel ke metode, yang kemudian mengubah nilai variabel dan hanya mengembalikannya.
Saya telah membaca bahwa menggunakan referensi menggunakan lebih sedikit memori, jadi mengapa mereka tidak digunakan dalam PHP?
return array($foo, $bar);
danlist($A, $B) = foobar();
Jawaban:
Penegasan Anda bahwa referensi jarang digunakan tidak benar. Seperti yang orang lain telah sebutkan ada banyak fungsi asli yang menggunakan referensi, contoh penting termasuk fungsi penyortiran array dan
preg_match()
/preg_match_all()
. Jika Anda menggunakan salah satu fungsi ini dalam kode Anda, Anda juga menggunakan referensi.Selanjutnya, referensi dalam PHP bukan petunjuk. Karena Anda berasal dari latar belakang C ++ saya bisa mengerti kebingungan, tetapi referensi PHP adalah binatang yang sama sekali berbeda, mereka alias ke tabel simbol . Setiap peningkatan kinerja yang Anda harapkan dari referensi C ++ tidak berlaku untuk referensi PHP.
Bahkan, dalam sebagian besar skenario, lewat nilai lebih cepat dan kurang intensif memori daripada lewat referensi. Zend Engine, inti PHP, menggunakan mekanisme optimisasi copy-on-write yang tidak membuat salinan variabel hingga dimodifikasi. Melewati dengan referensi biasanya mematahkan pola copy-on-write dan memerlukan salinan apakah Anda mengubah nilai atau tidak.
Jangan takut untuk menggunakan referensi dalam PHP ketika Anda perlu, tetapi jangan hanya melakukannya sebagai upaya untuk mengoptimalkan mikro. Ingat, optimasi prematur adalah akar dari semua kejahatan .
Bacaan lebih lanjut:
sumber
f($obj)
diberikanfunction f($x) { $x = new X; }
, harus$obj
mengacu pada yang berbeda objek dari sebelumnya panggilan untukf()
. Namun, karena objek tidak lulus dengan referensi, $ obj tidak dimodifikasi jika Anda menjalankan ini dengan PHP. Dengan cara itu, PHP melakukan hal yang sama dengan Java.PHP sudah melakukan copy-on-write di mana hal itu tidak menciptakan nilai baru sampai Anda mengubah sesuatu, jadi tidak ada banyak memori yang disimpan dengan menggunakan referensi. Melakukannya bahkan dapat mengacaukan beberapa hal yang dilakukan PHP secara internal untuk mengurangi penggunaan memori, membuat segalanya menjadi lebih buruk.
Tambahkan ke fakta bahwa referensi membuat hal-hal agak terlalu ajaib secara umum. Default, dan dengan demikian apa yang kebanyakan orang harapkan, adalah nilai per nilai; ketika saya beralih
$i
ke suatu fungsi, hal itu sangat rumit untuk harus peduli apakah fungsi itu secara misterius berubah$i
menjadi sesuatu yang lain, dan dengan demikian membuat salinan defensif untuk berjaga-jaga. (Ini sudah dapat memodifikasi$i
jika nilainya adalah objek, tetapi menurut saya tidak seharusnya.)Pada dasarnya, saya hanya akan menemukan pass-by-referensi yang berguna untuk "keluar" parameter, yang berarti variabel saya berharap untuk mendapatkan kembali dari fungsi daripada lulus dalam, ala
preg_match
's&$matches
. Bahkan untuk fungsi yang secara jelas memodifikasi objek yang dilewatkan, sepertisort
atauarray_pop
, yang terasa agak menjengkelkan ... tapi itulah yang kita terjebak.sumber
PHP adalah bahasa yang berorientasi web.
Halaman web dilayani dengan cepat dan harus ringan.
Program PHP biasa tinggal sebagian kecil dan mengkonsumsi beberapa ratus kilobyte memori.
Tidak ada gunanya untuk optimasi seperti itu.
sumber
Beberapa alasan dengan cepat:
sumber
Saya pikir ini hanya pilihan pengembang, tidak ada hubungannya dengan bahasa. Banyak kode PHP (bawaan dan bukan) menggunakan referensi. Lihatlah fungsi-fungsi array dalam PHP, banyak yang menggunakan referensi.
preg_match
menggunakan referensi.Saya pikir salah satu alasan pengembang memilih untuk tidak menggunakan referensi adalah karena dapat membingungkan. Anda memanggil suatu fungsi dan salah satu variabel mungkin (atau mungkin tidak) diperbarui karena itu adalah referensi. Jadi, ketika Anda debug, mungkin tidak jelas mengapa nilai
$x
jsut berubah secara ajaib.sumber
Masalah mendasar dengan pertanyaan Anda adalah Anda menganggap bahwa ini juga umum di C ++. Bukan itu. Kami tidak suka parameter output dan menggunakannya sesedikit mungkin - mereka hanya benar-benar umum di C-style API
sumber
Saya tahu banyak fungsi php yang melakukannya. Lihat
preg_match()
misalnya.$matches
akan diteruskan dengan referensiJika Anda ingin menulis fungsi untuk diri sendiri yang menggunakan argumen dengan referensi, gunakan sintaks berikut
$ a dan $ b disahkan oleh referensi $ c dilewatkan oleh nilai.
sumber