首頁 >後端開發 >php教程 >為什麼在 PHP 中將函數呼叫括在括號中可以避免引用錯誤?

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

Susan Sarandon
Susan Sarandon原創
2024-10-30 22:38:30925瀏覽

Why Does Wrapping a Function Call in Parentheses Avoid a Reference Error in PHP?

PHP 中模糊的函數調用行為:揭開隱藏的細微差別

在PHP 中,調用函數並封裝其結果時會調用出現一種奇怪的行為括號內。這種看似無害的操作可能會改變結果的解釋,從而可能導致意外行為。

考慮以下程式碼片段:

error_reporting(E_ALL | E_STRICT);

function get_array() {
   return array();
}

function foo() {
   return reset(get_array()); // Error: "Only variables should be passed by reference"

   return reset((get_array())); // Success
}

foo();

在第一個變體中,試著指派以下結果: reset() 函數的get_array() 會觸發錯誤,因為它應該是透過引用傳遞的變數。然而,當我們將函數呼叫括在括號中時,腳本會成功運行。

雖然人們可能會推測底層機制,但對文件的徹底檢查無法為這種現象提供明確的解釋。

深入研究 PHP 語法的複雜性並使用 phc 等工具視覺化程式碼的 AST,發現兩個片段都會產生相同的解析樹。這消除了語法更改影響行為的可能性。

但是,仔細檢查 PHP 操作碼結構會發現 ZEND_SEND_VAR_NO_REF 操作碼中隱藏的警告。此操作碼規定,當參數不是函數呼叫且引用計數為 1 時,不應引發引用錯誤。

在 foo() 的第二個變體中,由於不再識別函數呼叫到新增的括號。因此,系統將參數分類為 expr_without_variable 並啟動 SEND_VAR_NO_REF 操作碼。由於傳回的數組的引用計數為 1,因此它被認為適合作為變量,從而避免引用錯誤。

需要注意的是,此行為應被視為錯誤而不是預期功能。依賴這種不一致可能會導致不可預測且不可靠的程式碼。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn