疑問が生じました
ネチズン bercmisir は、PHP マニュアルの call_user_func 関数の文書化に関して病院にメッセージを残しました。その内容は、おおよそ次のとおりです:
http://php.net/manual/en/function.call-user- func.php
パラメータの下に次の文があります:
注: call_user_func() のパラメータは参照によって渡されないことに注意してください。
単純に翻訳すると、この関数のパラメータは参照によって渡されないことを意味します。
別の例:
コードをコピーします コードは次のとおりです:
error_reporting(E_ALL)
{
$var++;
call_user_f unc ('increment', $a);
echo $a."n";
call_user_func_array('increment', array(&$a)); // PHP 5.3 より前ではこれを使用できます
echo $a ."n ";
?>
出力は次のとおりです:
0
1
netizen bercmisir の問題は次のとおりです:
call_user_func('increment', $a); ', &$a ); しかし、出力は 1 であり、参照渡しできないことが明確に示されています。
根本原因の探索
その後、このノートの情報は実際にはバグ http://bugs.php.net/bug.php?id=24931 の最終処理結果です。
call_user_func('increment', &$a); では 1 の結果が出力されますが、通常の状況では、次の警告メッセージが表示されます。
その理由は何ですか?
まず例を見てみましょう:
コードをコピーします
コードは次のとおりです: error_reporting(E_ALL)
{
$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 のファイル ハード リンクに似ていますが、パーサー段階で PHP が使用する C 言語のポインターとは異なります。コンテキストによって、参照渡しか値渡しかを決定します。この記事で説明されている call_user_function は、それが参照であるか値であるかを決定しません。したがって、前の例の call_user_function は値渡しの場合は機能しませんが、参照渡しの場合は正しい結果が得られます (ただし、実際には非推奨の警告があります)。
http://www.bkjia.com/PHPjc/322215.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/322215.html技術記事この質問は、病院にメッセージを残したネチズン bercmisir によって提起されました。PHP マニュアルの call_user_func 関数のドキュメントについては、おおよそ次のとおりです。 http://php.net/manual/en/function.call-user -func.php その中には...