Dalam PHP, melampirkan hasil panggilan fungsi dalam kurungan boleh mengubah semantik hasil, seperti yang ditunjukkan oleh yang berikut kod:
<code class="php">function get_array() { return array(); } function foo() { // return reset(get_array()); // ^ error: "Only variables should be passed by reference" return reset((get_array())); // ^ OK } foo();</code>
Tingkah laku yang membingungkan ini tidak mempunyai penjelasan yang jelas dalam dokumentasi rasmi, menyebabkan pembangun tidak pasti tentang mekanisme asasnya.
Analisis
Kunci untuk memahami tingkah laku ini terletak pada kekaburan bahasa PHP dalam menghuraikan hujah panggilan fungsi. Apabila kurungan ditambah di sekeliling panggilan fungsi seperti dalam (get_array()), PHP menganggapnya bukan sebagai panggilan fungsi, tetapi sebagai ungkapan. Perbezaan ini adalah penting kerana opcode yang digunakan untuk menghantar pembolehubah (ZEND_SEND_VAR_NO_REF) mempunyai gelagat yang berbeza untuk panggilan fungsi berbanding dengan ungkapan.
Apabila ia menemui ungkapan panggilan bukan fungsi, ZEND_SEND_VAR_NO_REF melakukan semakan berikut:
Dalam contoh yang disediakan, fungsi dalam kurungan panggilan ((get_array())) memenuhi kedua-dua syarat:
Akibatnya, opcode meneruskan tanpa membuang ralat "Hanya pembolehubah harus diluluskan melalui rujukan". Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa tingkah laku ini dianggap sebagai pepijat dan tidak boleh dipercayai dalam kod pengeluaran.
Atas ialah kandungan terperinci Mengapa Mengkurung Panggilan Fungsi dalam PHP Mengelakkan Ralat Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!