ホームページ  >  記事  >  バックエンド開発  >  PHP 関数呼び出しの「参照によって変数のみを渡す必要があります」エラーが括弧で修正されるのはなぜですか?

PHP 関数呼び出しの「参照によって変数のみを渡す必要があります」エラーが括弧で修正されるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-26 20:54:02151ブラウズ

Why do Parentheses Fix

括弧と関数呼び出し結果の意味

次の例を考えてみましょう。

<?php
function get_array() {
    return array();
}

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

このコードでは、関数呼び出しの結果が参照ではないため、エラーが発生します。ただし、結果が括弧で囲まれている場合、エラーは消えます:

function foo() {
    return reset((get_array())); // OK
}

ここで何が起こっていますか?

この動作を明示的に説明しているドキュメントがないにもかかわらず、調べることで理解できます。 PHP の文法とコンパイラの実装。

解析への影響

括弧により、PHP のパーサーは関数呼び出しの結果を変数ではなく式として解釈します。これは、コンパイラによるコードの解釈方法、特に変数を関数に送信するために使用されるオペコードに影響します。

参照カウントと Zend エンジンの最適化

PHP のコア エンジンである Zend エンジンを使用すると、参照が予期される場所で、参照カウント 1 の非参照変数を使用できます。上の例では、返された配列は参照カウント 1 の新しいオブジェクトです。これにより、Zend エンジンはコードを最適化し、エラー メッセージを回避できます。

制限事項

この動作はバグとみなされ、信頼すべきではないことに注意することが重要です。関数呼び出し結果の参照カウントは、将来の PHP バージョンで変更される可能性があり、この動作に依存するコードが壊れる可能性があります。

代替ソリューション

不安定になる可能性のあるこの機能に依存しないようにするには動作を変更するには、関数呼び出しの結果を変数に明示的に代入します:

function foo() {
    $result = get_array();
    return reset($result);
}

以上がPHP 関数呼び出しの「参照によって変数のみを渡す必要があります」エラーが括弧で修正されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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