weakreference PHP の call_user_func が参照を渡すことによって引き起こされる考え

WBOY
リリース: 2016-07-29 08:43:24
オリジナル
1164 人が閲覧しました

疑問が提起されました
ネチズン bercmisir は、PHP マニュアルの call_user_func 関数の文書化に関して、病院にメッセージを残しました。その内容はおおよそ次のとおりです:
http://php.net/manual/en/function.call-user -func.php
パラメータの下に次のような文があります:
注意: call_user_func() のパラメータは参照によって渡されないことに注意してください。
単純に翻訳すると、この関数のパラメータは参照によって渡されないことを意味します。
別の例:

コードをコピーします。 コードは次のとおりです。機能( 'increment', $a); echo $a."n"; call_user_func_array('increment', array(&$a)); // PHP 5.3 より前ではこれを使用できます

echo $a."n " ;

?>


出力は次のとおりです:
0
1
ネットユーザーのbercmisirの問題は次のとおりです:
call_user_func('increment', $a); 出力は0、call_user_func('increment', &$ a); しかし、出力は 1 であり、参照渡しできないことを明確に示しています。
根本原因の探索
次に、このノートの情報は実際にはバグ http://bugs.php.net/bug.php?id=24931 の最終処理結果です。
call_user_func('increment', &$a); では 1 の結果が出力されますが、通常の状況では、次の警告メッセージが表示されます。
その理由は何ですか?
まず例を見てみましょう:




コードをコピーします

コードは次のとおりです:


error_reporting(&$var)
{
$var++;
$x; = 1;

increment( $x); echo $x; 逆に、8 番目の場合は、期待されるような警告メッセージはありません。コード行が &$x に変更されると、非推奨の警告が表示されます。実際、PHP での転送プロセス中に、変数は仮パラメータが参照を必要とするか値を必要とするかに基づいて、参照を転送するか値を転送するかを決定し、明示的に転送する必要がないことが確認できます。逆に、明示的な転送は間もなく廃止されます))。

さらに深く掘り下げ続けてください

http://www.php.net/manual/en/ language.references.pass.php
PHP マニュアルの、参照の受け渡しを紹介するセクションの真ん中に、次のような注記があります。発言: 関数呼び出し内 参照 (つまり、前のセクションで説明した明示的な呼び出し) を渡す必要はありません。5.3 では、明示的な呼び出しが行われると、非推奨の警告が表示されます。
ソースコードを分析する
「phpで書くときは、すべてが参照になる」という人もいます。
PHP ソースコードを確認してください。./Zend/zend_compile.c の 1579 行目に関数定義 zend_do_pass_param があります。 (php5.2.13)
このような判定があります:
if (original_op == ZEND_SEND_REF && !CG(allow_call_time_pass_reference)) {廃止警告を出力します。一般的な意味は、参照が渡され、php.ini のallow_call_time_pass_reference が No の場合、警告が出力されるということです。
zend_do_pass_param が使用されている場所を見ると、パーサーの段階で、var であるか、値であるか参照であるかが、パラメーター ZVAL 構造体の要素の定義に従って渡されることがわかります。 (php5.2.13 ./Zend/zend_ language_parser.y/c 451/3593)
結論
参照は実際には Linux のファイルのハードリンクに似ていますが、C 言語のポインターとは異なります。パーサーフェーズでは、php はコンテキストに従って、参照を渡すか値を渡すかは環境次第です。この記事で説明されている call_user_function は、それが参照であるか値であるかを決定しません。したがって、前の例の call_user_function は値渡しの場合は機能しませんが、参照渡しの場合は正しい結果が得られます (ただし、実際には非推奨の警告があります)。
以上、PHPのcall_user_funcの参照渡しによる弱参照についての考え方を、弱参照の内容も含めて紹介しましたので、PHPチュートリアルに興味のある方の参考になれば幸いです。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート