ホームページ  >  記事  >  バックエンド開発  >  PHP で関数呼び出しを括弧で囲むと参照エラーが回避されるのはなぜですか?

PHP で関数呼び出しを括弧で囲むと参照エラーが回避されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 22:35:30166ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。