weakreference PHP の call_user_func が参照を渡すことによって引き起こされる考え
疑問が提起されました
ネチズン 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チュートリアルに興味のある方の参考になれば幸いです。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
