Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Mengkurung Panggilan Fungsi dalam PHP Mengelakkan Ralat Rujukan?

Mengapa Mengkurung Panggilan Fungsi dalam PHP Mengelakkan Ralat Rujukan?

Susan Sarandon
Susan Sarandonasal
2024-10-26 22:35:30166semak imbas

Why Does Parenthesizing a Function Call in PHP Avoid a Reference Error?

Kurungan dan Semantik Panggilan Fungsi dalam PHP

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:

  1. Argumen bukan panggilan fungsi.
  2. Argumen adalah sama ada rujukan atau mempunyai kiraan rujukan 1.

Dalam contoh yang disediakan, fungsi dalam kurungan panggilan ((get_array())) memenuhi kedua-dua syarat:

  1. Ia tidak dikenali sebagai panggilan fungsi kerana kurungan tambahan.
  2. Anasusunan yang dikembalikan mempunyai kiraan rujukan 1 kerana ia hanya dirujuk dalam panggilan fungsi.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn