php引用变量的概念和定义方式
概念:在php中引用意味着不同的名字访问同一个变量内容。
定义方式:使用&符号
工作原理:
<?php header("content-type:text/html;charset=utf-8"); //定义一个变量a $a = range(0,100); var_dump(memory_get_usage());//查看内存使用情况 echo "</br>"; //定义变量b,将a变量的值赋值给b,遵循写时改变(copy on write)的原则 $b = $a; var_dump(memory_get_usage()); echo "</br>"; //对a进行修改 $a = range(0,100); var_dump(memory_get_usage()); ?>
三次输出的内存使用情况分别为:int(144640) 、int(144688) 、int(153368),可知,由于遵循写时改变的原则,a指向了新的空间,故第三次打印内存占用时数值明显增大。
<?php header("content-type:text/html;charset=utf-8"); //定义一个变量a $a = range(0,100); var_dump(memory_get_usage());//查看内存使用情况 echo "</br>"; //定义变量b,将a变量的值赋值给b,遵循写时改变(copy on write)的原则 $b = &$a; //改为引用复制,此时a和b永远指向同一个空间,而不会复制 var_dump(memory_get_usage()); echo "</br>"; //对a进行修改 $a = range(0,100); var_dump(memory_get_usage()); ?>
此时,打印出来的结果分别为:int(144640) 、int(144688) 、int(144680),区别不大,由此可知,a和b还是指向同一空间,当对a进行修改时,就是对a和b共同指向的空间内容的修改。
需要指出的是,unset()函数只会取消引用,而不会销毁空间
<?php header("content-type:text/html;charset=utf-8"); $a = 1; $b = &$a; unset($b); echo $a." "; //结果输出1 ?>
对象也遵循引用思想,而不是写时复制,例如:
<?php header("content-type:text/html;charset=utf-8"); class Person{ public $name = "xiaolin"; } $p1 = new Person(); $p2 = $p1; $p2->name = "xiaolinzi"; ?>
在这个例子中,p1和p2同时指向同一个空间,若$p2->name改变,则是该空间的内容进行修改。