ホームページ  >  記事  >  バックエンド開発  >  PHPの変数参照と変数破棄の仕組みを詳しく解説

PHPの変数参照と変数破棄の仕組みを詳しく解説

墨辰丷
墨辰丷オリジナル
2018-05-29 17:44:321220ブラウズ

変数は php の非常に重要なタイプです。すべてのデータは変数または定数を介して操作されます。必要な方は、

php の変数参照と変数の破壊メカニズムを参照してください。 phpでは「&」という記号が参照を表します。

1. 次のように引用せずに状況を見てください:

$a = “hello world”;//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子”$b= & $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;//输出test new value,因为改变了b的值也会改变a的值。
=====================================
经常在定义函数的时候看到像这样的情况:
function test (& $param)
{
//函数定义的内容
$param++;
}

説明: $param の前に参照があるため、パラメータが渡されますin はメモリ内にコピーを作成しませんが、元のメモリ空間を直接参照します。したがって、記号 & を使用して渡された変数値が変更されると、元のメモリ空間の値も変更されます。

次のようにテストしてください:

$k = 8;
test($k);
echo $k;//结果$k的值被函数里面改变了,输出9。
还会经常看到这样子调用函数:
$return = & test_func();

php エンジンのメカニズムは次のとおりであることを以前に学びました: = は右側のコンテンツを左側の変数にコピーします。したがって、& を使用するということは、関数の結果をコピーすることを意味し、実際には、ポインタは左側の変数に与えられるということです。

ポインタとは何ですか? 私は以前 C 言語でその概念を学びました。私の理解では、ポインタ、ポインタ、指示針(コンパス、笑)です。ポインタをメモリのアドレスと考えると理解しやすくなります。コンピュータはメモリ内のデータの場所を認識します。これは表面的な理解なので、深く理解する方法はわかりません(笑)。

概要: 参照を使用してメモリ リソースの使用量を削減します。

PHPマニュアルでの参照の説明は次のとおりです:

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

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

テスト: $b = & $a;

$b の値が変更されるため、$b が破棄された場合 (メモリに領域が占有されていないため、null ではありません) も $a の値が変更されます。 、値でもありません)が "")の場合、$a の値も削除されますか?

実は、この仕組みについて具体的に言及しているPHPの洋書があります。 2年前に見たよ。よく覚えていない。原理は、変数が削除されると自動的にコピーされるということです。
実際、これは $b を削除して $a を削除するという問題が発生するのを避けるためです。


<?php
$a = &#39;d&#39;;
$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 は未使用の変数をリサイクルするためにこのシンボル テーブルを使用します。スペース、メモリスペースを解放します)。シンボル テーブルに基づいた 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的值为"PHP",等同于$short=& $$long; */
print "01 /$short is $short.";  /* "/$"是转义序列,表示输出一个美元符号$,下同。本语句的作用是输出:01 $short is PHP. */
print "02 Long is $big_long_variable_name."; /* 输出:02 Long is PHP. */
?>
<br />
<br />
<?php $big_long_variable_name.=" rocks!"; /* 重新对$big_long_variable_name赋值。重新赋值过程中,由于在$big_long_variable_name的后面添加了.(点号),因而变量$big_long_variable_name此时的值应为原值("PHP")+新值(" rocks!"),即变量$big_long_variable_name当前完整的值为"PHP rocks!"。下同。*/
print "03 /$short is $short";  /* 输出:03 $short is PHP rocks! */
print "04 Long is $big_long_variable_name"; /* 输出:04 Long is PHP rocks! */
?>
<br />
<br />
05 $short is PHP rocks!
06 Long is PHP rocks!
<br />
<br />
<?php $short.="Programming $short";  /* 重新对变量$short赋值。由于在$short后面添加了.(点号),因此请参考上例分析$short的值。*/
print "07 /$short is $short";  /* 输出:07 $short is PHP rocks!Programming PHP rocks! */
print "08 Long is $big_long_variable_name"; /* 由于变量$short被重新赋值为Programming PHP rocks!,因而变量$big_long_variable_name的值也与$short一同被改变为"PHP rocks!Programming PHP rocks!"。本语句输出:08 Long is PHP rocks!Programming PHP rocks!注意,如果是对具有相同值的一个变量进行销毁unset( ),则另一个变量不适用于此种情况,即不会随之被一同销毁。*/
?>
<br />
<br />
09 $short is Programming PHP rocks!
10 Long is Programming PHP rocks!
<br />
<br />
<?php $big_long_variable_name.="Web Programming $short"; /* 变量$big_long_variable_name被重新赋值,此时它完整的值应为PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!。变量$short的值此时与变量$big_long_variable_name一致。请分别参考第5处、第10处注释进行分析。*/
print "11 /$short is $short";   /* 输出:11 PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "12 Long is $big_long_variable_name";
?>
<br />
<br />
<?php
unset($big_long_variable_name);  /* 用unset( )销毁变量$big_long_variable_name,变量$short不会因此受到任何影响。*/
print "13 /$short is $short";  /* 虽然销毁了变量$big_long_variable_name,但$short没有受到影响,它的值仍是最近一次被赋予的PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks! */
print "14 Long is $big_long_variable_name."; /* 变量$big_long_variable_name已被销毁,故而无值。输出:14 Long is. */
snow;                  
?>
<br />
<br />
<?php $short="No point TEST1";  /* 重新对变量$short赋值。由于这次没有在$short后面添加.(点号),因此$short当前的值为"No point TEST1"。*/
print "15 /$short is $short.";  /* 输出:15 $short is No point TEST1. */
$short="No point TEST2 $short";  /* 重新对变量$short赋值。没在$short的后面添加.(点号),但引用了它自身最近一次的值"No point TEST1"。*/
print "16 /$short is $short.";  /* 输出:16 $short is No point TEST2 No point TEST1. */

上記がこの記事の全内容です、皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHP

ファイルアップロードの関連知識と応用

PHP

ループ - While ループの理解と使用

PHP

5 つの echo および print ステートメント

の関連知識と応用

以上がPHPの変数参照と変数破棄の仕組みを詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。