PHP引用变量相关问题

什么是引用变量?

在PHP中引用意味着用不同的名字访问同一个变量内容
定义方式:
使用&符号

1、普通变量赋值依据cow机制,

1.1 vim demo1.php
<?
//定义一个变量
$a = range(0,1000);
var_dump(memory_get_usage());
//定义一个变量b,将a变量赋值给b
//根据cow copy on wirte 机制,如果a没有被重新进行写操作,b不会开辟新的内存空间
$b = $a;
var_dump(memory_get_usage());//对比第一次,内存不会有明显变化
//对a进行修改
$a = range(0,1000);
var_dump(memory_get_usage());//由于对a重新赋值,b也被赋予新的内存空间
?>

运行结果:

[root@chen php]# php demo1.php
int(366104)
int(366240)
int(510744)

1.2 x_debug_zval显示变量的引用情况

<?php
$a = range(0,10);
xdebug_debug_zval('a');
$b = $a;
xdebug_debug_zval('a');
$a = range(0,10);
xdebug_debug_zval('a');

运行结果:

a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
a: (refcount=2, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
屏幕快照 2017-10-24 上午10.32.32.png

2、使用引用赋值

2.1 vim demo2.php
<?
//定义一个变量
$a = range(0,10);
var_dump(memory_get_usage());
//定义一个变量b,将a变量赋值给b
//根据cow copy on wirte 机制,如果a没有被重新进行写操作,b不会开辟新的内存空间
$b = &$a;
var_dump(memory_get_usage());
//对a进行修改
$a = range(0,10);

var_dump(memory_get_usage());
?>

运行结果:

[root@chen php]# php demo2.php
int(223352)
int(223488)
int(223464)

结果显示,使用引用后,b就指向a的内存地址,a被重新写入,b的值也不会变化。

2.2 x_debug_zval显示变量的引用情况
<?php
$a = range(0,10);
xdebug_debug_zval('a');
$b = &$a;
xdebug_debug_zval('a');
$a = range(0,10);
xdebug_debug_zval('a');

运行结果:

a: (refcount=1, is_ref=0)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
a: (refcount=2, is_ref=1)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
a: (refcount=2, is_ref=1)=array (0 => (refcount=1, is_ref=0)=0, 1 => (refcount=1, is_ref=0)=1, 2 => (refcount=1, is_ref=0)=2, 3 => (refcount=1, is_ref=0)=3, 4 => (refcount=1, is_ref=0)=4, 5 => (refcount=1, is_ref=0)=5, 6 => (refcount=1, is_ref=0)=6, 7 => (refcount=1, is_ref=0)=7, 8 => (refcount=1, is_ref=0)=8, 9 => (refcount=1, is_ref=0)=9, 10 => (refcount=1, is_ref=0)=10)
屏幕快照 2017-10-24 上午10.45.09.png

3、引用的销毁 unset

注意:unset只会取消引用,不会销毁空间
示例:
vim demo5.php

<?php
<?php
$a = 1;
$b = &$a;
unset($b);
echo $a."\n";

运行结果:

[root@chen php]# php demo5.php
1

对象本省就是引用传值,不需要引用符号

示例1:

<?php
class Person{
    public $name = 'chenzhitao';
}
$p1 = new Person;
xdebug_debug_zval('p1');
$p2 = $p1;
xdebug_debug_zval('p1');
$p2->name = 'Jason';
xdebug_debug_zval('p1');

运行结果:

[root@chen php]# php demo6.php
p1: (refcount=1, is_ref=0)=class Person { public $name = (refcount=2, is_ref=0)='chenzhitao' }
p1: (refcount=2, is_ref=0)=class Person { public $name = (refcount=2, is_ref=0)='chenzhitao' }
p1: (refcount=2, is_ref=0)=class Person { public $name = (refcount=1, is_ref=0)='Jason' }
屏幕快照 2017-10-24 上午10.59.57.png

示例2:

<?php

/**
 * 写出如下程序的输出结果
 * <?php
 *
 * $data = ['a', 'b', 'c'];
 *
 * foreach($data as $key => $val)
 * {
 *      $val = &$data[$key];
 * }
 * 程序运行时,每一次循环结束后变量$data的值是什么?请解释
 * 程序执行完成后,变量$data的值是什么?请解释
 */

$data = ['a', 'b', 'c'];

foreach ($data as $key=>$val)
{
    $val = &$data[$key];
    var_dump($data);
}

var_dump($data);

运行结果:

  [0]=>
  &string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  &string(1) "b"
  [2]=>
  string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  &string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  &string(1) "c"
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • SH4300型石笼网机是一种捻织大丝经,大网孔,宽幅面的金属丝六角网的专用设备。其产品用途十分广泛。可用于边坡支护...
    大事爆料阅读 4,415评论 0 0
  • 我听见有人说。 “又是一年落叶时。” 正是中秋重阳后,天朗气清,惠风和畅。 傍晚时,零零散散的行人走在街上,风很大...
    潍科WK阅读 1,810评论 0 0
  • 自从搬了办公室之后,我不喜欢呆办公室了。并不是因为我害怕跟领导的相处,或者说觉得跟领导一个屋觉得尴尬什么的…...
    车前小草阅读 1,594评论 0 1

友情链接更多精彩内容