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 中国語 Web サイトの他の関連記事を参照してください。