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中文網其他相關文章!