PHP中变量引用与变量销毁机制分析(2)
其实这样子,就是为了避免把$b给删掉,造成把$a也给删掉的问题。 复制代码 代码如下: php $a = 'd'; $b = $b = 8;//因为是引用了,所以把b的值改掉,a的值也跟
其实这样子,就是为了避免把$b给删掉,造成把$a也给删掉的问题。
复制代码 代码如下:
<?php
$a = 'd';
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8
$a = 'd';
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出null和8
调用unset删除$b变量的时候,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. */
$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中substr()函数参数说明及用法实例
- 下一篇:php 超实用的模板引擎
精彩图集
精彩文章






