ホームページ  >  記事  >  バックエンド開発  >  PHP の call_user_func が Reference_PHP チュートリアルを渡すことで生じる考え

PHP の call_user_func が Reference_PHP チュートリアルを渡すことで生じる考え

WBOY
WBOYオリジナル
2016-07-21 15:35:19956ブラウズ

疑問が生じました
ネチズン 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

tru​​e

技術記事この質問は、病院にメッセージを残したネチズン bercmisir によって提起されました。PHP マニュアルの call_user_func 関数のドキュメントについては、おおよそ次のとおりです。 http://php.net/manual/en/function.call-user -func.php その中には...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。