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

PHPにおける変数参照と変数破棄の仕組みの解析、PHP破棄_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:13:591133ブラウズ

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 までご連絡ください。