在PHP 中,將函數呼叫的結果括在括號中可以改變結果的語義,如下所示程式碼:
<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>
這種令人費解的行為在官方文件中沒有明確的解釋,導致開發者對其底層機制不確定。
分析
理解這種行為的關鍵在於 PHP 語言在解析函數呼叫參數時的模糊性。當函數調用周圍添加括號(如 (get_array()) 所示)時,PHP 不會將其視為函數調用,而是視為表達式。這種區別至關重要,因為與表達式相比,用於傳送變數的操作碼 (ZEND_SEND_VAR_NO_REF) 對於函數呼叫具有不同的行為。
當遇到非函數呼叫表達式時,ZEND_SEND_VAR_NO_REF 會執行下列檢查:
在提供的範例中,括號內的函數call ((get_array())) 滿足兩個條件:
因此,操作碼繼續執行而不會拋出「僅變數應透過引用傳遞」錯誤。但是,請務必注意,此行為被視為錯誤,不應在生產程式碼中依賴。
以上是為什麼在 PHP 中對函數呼叫加括號可以避免引用錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!