検索
ホームページバックエンド開発PHPチュートリアルPHPにおける変数参照と変数破棄の仕組みの解析、PHP破棄_PHPチュートリアル

PHPにおける変数参照と変数破壊機構の解析、PHP破壊

この記事では、PHP の変数参照と変数破棄のメカニズムを例とともに分析します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:

変数は PHP において非常に重要な型です。すべてのデータは変数または定数を介して操作されます。変数の参照と変数の破棄を見てみましょう。

phpでは、記号「&」は参照を表します。

1. 引用なしで状況を見てみましょう:

コードをコピーします コードは次のとおりです:
$a = "hello world";//変数を定義し、$b に代入します
$b = $a;//このステップでは、「$b= & $a」のように $a の前に記号 & を追加しません。 & を追加しない場合、実際の原理は変数 $a のコピーを作成することです。つまり、変数 $b を格納するために新しいアドレスがメモリに適用されます

ps: PHP では、「=」を使用して値を直接代入すると、実際には右側の変数のコピーが b にコピーされることになり、メモリ領域が生成されます。その結果、同じ内容が 2 つのコピーに格納される可能性があります。メモリ。 PHP パフォーマンスのいくつかの側面で述べたように、これにより多くのメモリ領域が占有されます。しかし、私が聞いたところでは、ほとんどの人はこのことにあまり注目していませんでした。実際、このような一般的な適用によって生じる大きな違いは明らかではありません。実際、私は引用に & をあまり使いません (笑)。ただ、実装原理を深く理解することが非常に必要だと思います。私は基本的なことに焦点を当てるのが好きです。

2. 引用には & 記号を使用します

コードをコピーします コードは次のとおりです:
$a = "hello world";
$b = &$a;

参照を使用すると、PHP エンジンは変数をコピーしません。実際、ポインタはメモリ内の $a のアドレスを指し、$b はこのポインタを保存します。
したがって、参照を使用する場合、$b の値を変更すると、それに応じて $a も変更されます
例:
コードをコピーします コードは次のとおりです:
$a = "hello world";
$b = &$a;
$b = "test new value";//b の値を変更すると、a の値も変更されます
echo $a;// b の値を変更すると a の値も変更されるため、テスト用の新しい値を出力します。

関数を定義するときに次のような状況をよく見かけます:

コードをコピーします コードは次のとおりです:
function test (& $param)
{
//関数定義の内容
$param++;
}

説明: $param の前に参照があるため、渡されたパラメータはメモリにコピーされず、元のメモリ空間を直接参照します。したがって、記号 & を使用して渡された変数値が変更されると、元のメモリ空間の値も変更されます。
以下のクイズに答えてください:
コードをコピーします コードは次のとおりです:
$k = 8;
テスト($k);
echo $k;//その結果、関数内で$kの値が変更され、9が出力されました。

次のように呼び出される関数をよく見かけます:
コードをコピーします コードは次のとおりです:
$return = & test_func();

PHP エンジンのメカニズムは次のとおりであることを以前に学びました: = は右側のコンテンツを左側の変数にコピーします。したがって、& を使用するということは、関数の結果をコピーすることを意味し、実際には、ポインタは左側の変数に与えられるということです。
ポインタとは何ですか?私はC言語でその概念を学びました。私の理解では、ポインタ、ポインタ、指示針(コンパス、笑)です。ポインタをメモリのアドレスと考えると理解しやすくなります。コンピュータはメモリ内のデータの場所を認識します。これは表面的な理解なので、深く理解する方法はわかりません(笑)。

概要: 参照を使用すると、メモリ リソースの使用量が削減されます。

PHPマニュアルの引用符の説明は以下の通りです:

PHP でのクォートとは、同じ変数の内容に異なる名前でアクセスすることを意味します。これは C ポインターとは異なり、参照はシンボル テーブルのエイリアスです。 PHP では変数名と変数の内容が異なるため、同じ内容でも異なる名前が付けられることに注意してください。最も近い類似点は、Unix のファイル名とファイル自体です。変数名はディレクトリ エントリであり、変数の内容はファイル自体です。参照は、Unix ファイル システムのハードリンクと考えることができます。

3. 変数を破棄するとき。元の値は変わりません。

実験: $b = & $a;
$b の値が変更されるため、$a の値も変更されます。$b が破棄されると (メモリ内にスペースが存在せず、null ではなく、値が "" になります)、$a の値も変更されます。削除するのはどうですか?

実は、この仕組みについて具体的に言及しているPHPの洋書があります。 2年前に見たよ。よく覚えていない。原則として、変数が削除されると自動的にコピーされます。

実際、これは $b を削除して $a を削除するという問題が発生するのを避けるためです。

コードをコピーします コードは次のとおりです:
$a = 'd';
$b = & $a;
$b = 8;//引用符で囲まれているのでbの値が変更され、aの値も8に変更されます。
var_dump($b,$a);
unset($b);// unset を呼び出して変数 b を削除します。変数 a は削除されません
var_dump($b,$a);//null と 8 を出力します

$b 変数を削除するために unset を呼び出すと、PHP エンジンは変数シンボル テーブルから次のことを検出しました。削除したい変数 $b はもともと変数 $a を参照していましたが、一度削除すると $a 変数が削除されてしまうため、削除するのは困難でした。がなくなったので、まず $a 変数のコピーを作成してから、$b 変数を削除します。
PHP シンボル テーブルについて: 実際、私の理解では、動作中のすべての変数名がそこに記録され、PHP は、当然のことながら、未使用の変数スペースをリサイクルするためにこのシンボル テーブルを使用します。メモリ領域を解放します)。シンボル テーブルに基づいた PHP のガベージ コレクション メカニズム (使用されなくなったメモリ領域を解放する) を見てみましょう。

コードをコピーします コードは次のとおりです:
$long="big_long_variable_name";
$$long="PHP"; /* 変数 $long に格納されている文字列を新しい変数の変数名として使用します。これは $big_long_variable_name="PHP" と同等です。 */
$short=& $big_long_variable_name; /* 変数 $big_long_variable_name の値を変数 $short に代入します。このとき、$short の値は $short=& $$long; と同等です。 */
print "01 /$short is $short."; /* "/$" はドル記号 $ が出力されることを示すエスケープシーケンス (以下同様)。このステートメントの機能は、次のように出力することです: 01 $short is PHP. print "02 Long は $big_long_variable_name."; /* 出力: 02 Long は PHP です。 ?>




$big_long_variable_name.=" ロックス!" /* $big_long_variable_name を再割り当てします。再代入処理では、$big_long_variable_name の後に . (ドット) が追加されるため、この時点の変数 $big_long_variable_name の値は、元の値 (「PHP」) + 新しい値 (「rocks!」) になります。 、変数 $big_long_variable_name 現在の完全な値は「PHP Rocks!」です。以下同様。 */
print "03 /$short は $short"; /* 出力:03 $short は PHP です! */
print "04 Long は $big_long_variable_name"; /* 出力: 04 Long は PHP です! */
?>




05 $short は PHP のロックです!
06 ロングは PHP ロックです!




$short.="プログラミング $short"; /* 変数 $short を再割り当てします。 $shortの後には.(ドット)が付加されているので、上記の例を参考に$shortの値を解析してください。 */
print "07 /$short は $short"; /* 出力:07 $short は PHP のプログラミングです! */
print "08 Long is $big_long_variable_name"; /* 変数 $short がプログラミング PHP Rocks! に再割り当てされるため、変数 $big_long_variable_name の値も $short とともに "PHP Rocks! プログラミング PHP Rocks!" に変更されます。このステートメントの出力: 08 Long is PHP rocks! Programming PHP rocks! 同じ値を持つ変数が unset() によって破棄された場合、他の変数はこの状況に当てはまらない、つまり、一緒に破棄されないことに注意してください。 。 */
?>




09 $short は PHP プログラミングの魅力です!
10 長い PHP プログラミングは素晴らしいです!




$big_long_variable_name.="Web プログラミング $short"; /* この時点で、変数 $big_long_variable_name が再割り当てされます。 プログラミング PHP プログラミング PHP ロック!変数 $short の値が変数 $big_long_variable_name と一致するようになりました。分析については、それぞれ注 5 と 10 を参照してください。 */
print "11 /$short は $short"; /* 出力:11 PHP の素晴らしい!PHP のプログラミングが素晴らしい!Web プログラミング PHP の素晴らしい!PHP のプログラミングが素晴らしい! */
print "12 Long は $big_long_variable_name";
?>




unset($big_long_variable_name); /* unset() を使用して変数 $big_long_variable_name を破棄します。変数 $short は影響を受けません。 */
print "13 /$short is $short"; /* 変数 $big_long_variable_name は破棄されますが、$short は影響を受けず、その値は最後に割り当てられた値のままです PHP はすごい!プログラミング PHP はすごい!Web プログラミング PHP はすごい!プログラミング PHPロック*/
print "14 Long is $big_long_variable_name."; /* 変数 $big_long_variable_name は破棄されているため、値がありません。出力: 14 Long は */
です。 雪; ?>




print "15 /$short は $short です。"; /* 出力: 15 $short はノーポイントです */
$short="ノーポイント TEST2 $short"; /* 変数 $short を再割り当てします。 $short の後に「.」が追加されていますが、その最新値「No point TEST1」が引用符で囲まれています。 */
print "16 /$short は $short です。"; /* 出力:16 $short はポイントがありません TEST2 はポイントがありません */

この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/912291.html技術記事 PHP における変数参照と変数破壊の仕組みの分析、PHP 破壊 この記事では、PHP における変数参照と変数破壊の仕組みを例とともに分析します。参考のためにみんなで共有してください。具体的な分析は次のとおりです: 変数...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
絶対的なセッションタイムアウトとアイドルセッションのタイムアウトの違いは何ですか?絶対的なセッションタイムアウトとアイドルセッションのタイムアウトの違いは何ですか?May 03, 2025 am 12:21 AM

絶対セッションのタイムアウトはセッションの作成時に開始され、アイドルセッションタイムアウトはユーザーの操作なしに開始されます。絶対セッションタイムアウトは、金融アプリケーションなど、セッションライフサイクルの厳格な制御が必要なシナリオに適しています。アイドルセッションタイムアウトは、ソーシャルメディアなど、ユーザーが長い間セッションをアクティブに保つことを望んでいるアプリケーションに適しています。

セッションがサーバーで機能していない場合、どのような措置を講じますか?セッションがサーバーで機能していない場合、どのような措置を講じますか?May 03, 2025 am 12:19 AM

サーバーセッションの障害は、手順に従って解決できます。1。セッションが正しく設定されていることを確認するために、サーバーの構成を確認します。 2.クライアントCookieを確認し、ブラウザがそれをサポートしていることを確認し、正しく送信します。 3. Redisなどのセッションストレージサービスを確認して、それらが正常に動作していることを確認します。 4.アプリケーションコードを確認して、正しいセッションロジックを確認します。これらの手順を通じて、会話の問題を効果的に診断および修復し、ユーザーエクスペリエンスを改善することができます。

session_start()関数の重要性は何ですか?session_start()関数の重要性は何ですか?May 03, 2025 am 12:18 AM

session_start()iscrucialinphpformangingusersions.1)itInitiateSanewsessionifnoneExists、2)resumesanexistingsession、および3)SetSessionCookieforcontinuityAcrossRequests、ApplicationslicationSliviseSlikeUserauthicationAnticatent。

セッションクッキーにHTTPonlyフラグを設定することの重要性は何ですか?セッションクッキーにHTTPonlyフラグを設定することの重要性は何ですか?May 03, 2025 am 12:10 AM

HTTPonlyフラグを設定することは、XSS攻撃を効果的に防止し、ユーザーセッション情報を保護することができるため、セッションCookieにとって重要です。具体的には、1)HTTPONLYフラグは、JavaScriptがCookieにアクセスするのを防ぎます。2)Flagは、PHPとFlaskのSetCookiesとMake_Responseを介して設定できます。

PHPセッションはWeb開発でどのような問題を解決しますか?PHPセッションはWeb開発でどのような問題を解決しますか?May 03, 2025 am 12:02 AM

phpsessionssolvetheprobrof of maintainsea crossmultiplehttprequestsbyStoringdataontaonsociatingitiTauniquesessionid.1)それらは、通常はヨーロッパの側面、および一般的には、測定されている

どのデータをPHPセッションに保存できますか?どのデータをPHPセッションに保存できますか?May 02, 2025 am 12:17 AM

phpssionscanStorestrings、numbers、arrays、andobjects.1.strings:textdatalikeusernames.2.numbers:integersorfloatsforcounters.3.arrays:listslikeshoppingcarts.4.objects:complextructuresthataresialized。

どのようにPHPセッションを開始しますか?どのようにPHPセッションを開始しますか?May 02, 2025 am 12:16 AM

tostartaphpsession、outsession_start()atthescript'sbeginning.1)placeitbe foreanyouttosetthesscookie.2)usesionsionsionsionserdatalikelogintatussorshoppingcarts.3)再生セッションインドストップレベントフィックスアタック

セッションの再生とは何ですか?また、セキュリティをどのように改善しますか?セッションの再生とは何ですか?また、セキュリティをどのように改善しますか?May 02, 2025 am 12:15 AM

セッション再生とは、新しいセッションIDを生成し、セッション固定攻撃の場合にユーザーが機密操作を実行するときに古いIDを無効にすることを指します。実装の手順には次のものが含まれます。1。感度操作を検出、2。新しいセッションIDを生成する、3。古いセッションIDを破壊し、4。ユーザー側のセッション情報を更新します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター