為什麼在 PHP 中對函數呼叫加括號可以避免引用錯誤?

Susan Sarandon
發布: 2024-10-26 22:35:30
原創
165 人瀏覽過

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

PHP 中的括號和函數呼叫語義

在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 會執行下列檢查:

  1. 參數不是函數呼叫。
  2. 參數是引用或引用計數為 1。

在提供的範例中,括號內的函數call ((get_array())) 滿足兩個條件:

  1. 由於多餘的括號,它不會被識別為函數呼叫。
  2. 傳回的陣列引用計數為 1因為它只在函數呼叫中被引用。

因此,操作碼繼續執行而不會拋出「僅變數應透過引用傳遞」錯誤。但是,請務必注意,此行為被視為錯誤,不應在生產程式碼中依賴。

以上是為什麼在 PHP 中對函數呼叫加括號可以避免引用錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!