Kurungan dan Maksud Keputusan Panggilan Fungsi
Pertimbangkan contoh berikut:
<?php function get_array() { return array(); } function foo() { return reset(get_array()); // Error: "Only variables should be passed by reference" }
Dalam kod ini, ralat berlaku kerana hasil panggilan fungsi bukan rujukan. Walau bagaimanapun, jika hasilnya dibalut dalam kurungan, ralat itu hilang:
function foo() { return reset((get_array())); // OK }
Apa yang berlaku di sini?
Walaupun tiada dokumentasi yang menerangkan tingkah laku ini secara eksplisit, ia boleh difahami dengan memeriksa tatabahasa PHP dan pelaksanaan pengkompil.
Kesan pada Penghuraian
Kurungan menyebabkan penghurai PHP mentafsir hasil panggilan fungsi sebagai ungkapan dan bukannya pembolehubah. Ini mempengaruhi cara pengkompil mentafsir kod, terutamanya opcode yang digunakan untuk menghantar pembolehubah kepada fungsi.
Kira Rujukan dan Pengoptimuman Enjin Zend
Enjin Zend, enjin teras PHP , membenarkan pembolehubah bukan rujukan dengan kiraan rujukan 1 untuk digunakan di mana rujukan dijangkakan. Dalam contoh di atas, tatasusunan yang dikembalikan ialah objek baharu dengan kiraan rujukan 1. Ini membolehkan Enjin Zend mengoptimumkan kod dan mengelakkan mesej ralat.
Penghadan
Perlu ambil perhatian bahawa tingkah laku ini dianggap sebagai pepijat dan tidak boleh dipercayai. Kiraan rujukan hasil panggilan fungsi mungkin berubah dalam versi PHP akan datang, memecahkan kod yang bergantung pada tingkah laku ini.
Penyelesaian Alternatif
Untuk mengelakkan bergantung pada ini yang berpotensi tidak stabil tingkah laku, tetapkan secara eksplisit hasil panggilan fungsi kepada pembolehubah:
function foo() { $result = get_array(); return reset($result); }
Atas ialah kandungan terperinci Mengapa Tanda Kurung Membetulkan Ralat \'Hanya Pembolehubah Harus Dilalui Melalui Rujukan\' dalam Panggilan Fungsi PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!