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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 22:38:30879ブラウズ

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();

最初のバリアントでは、次の結果を代入しようとしています。 get_array() から replace() 関数への関数は、参照によって渡される変数である必要があるため、エラーが発生します。ただし、関数呼び出しを括弧で囲むと、スクリプトは正常に実行されます。

基礎的な仕組みについて推測することはできますが、ドキュメントを徹底的に調べても、この現象の明確な説明は得られません。

PHP 文法の複雑さをさらに深く掘り下げ、phc などのツールを使用してコードの AST を視覚化すると、両方のスニペットが同一の解析ツリーを生成することがわかりました。これにより、構文の変更が動作に影響を与える可能性が排除されます。

しかし、PHP オペコード構造を詳しく調べると、ZEND_SEND_VAR_NO_REF オペコード内に隠れた警告が明らかになります。このオペコードは、引数が関数呼び出しではなく、参照カウントが 1 である場合に参照エラーをスローしてはならないと指示しています。

foo() の 2 番目のバリアントでは、次の理由により関数呼び出しが認識されなくなりました。追加された括弧に。その結果、システムは引数を expr_without_variable として分類し、SEND_VAR_NO_REF オペコードを開始します。返された配列の参照カウントは 1 であるため、変数として適切であると見なされ、参照エラーが回避されます。

この動作は意図された機能ではなくバグとしてみなされることに注意することが重要です。 。このような不一致に依存すると、予測不能で信頼性の低いコードが作成される可能性があります。

以上がPHP で関数呼び出しを括弧で囲むと参照エラーが回避されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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