首页 > PHP引用传递的问题,为什么是这样

PHP引用传递的问题,为什么是这样

1)为什么 $a 结果是hello 而不是 undefined?

$a = "hello";
$b =& $a;
unset($b);
$b = "world";
var_dump($a); // hello

2)为什么 $a 结果是 1 而不是 2?

$a = 1;
$x =& $a;
$b = $a++;
var_dump($b); // 1


1,b是a的快捷方式,马甲。快捷方式删除了不受影响。
2,$a++是表示语句执完才+1。你想得到2的结果改成$b = ++$a;或var_dump($a);即可


unset()函数只是unset掉$b对于$a的引用。
因此$a自己指向的空间依然会保留下来,只是对于$b的引用计数和is_ref标记被删除了。
因此$a并不符合垃圾回收机制回收的对象。
关于PHP的引用机制可以从引用计数基本知识中获取答案。


第一个是因为, unset() 一个通过引用传递的变量,只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

第二个是运算优先级的问题, ++在前先自增后计算表达式, ++在后先计算表达式后自增


首先说一下PHP中变量的理解:变量可以看做一个盒子,而变量名相当于这个盒子的标签,应用传递只是相当于给同一个盒子贴了两个标签,值传递是重新制作了一个一模一样的盒子!
局部变量名是存放在栈内存中的,unset()函数只是将一个变量的指向地址和变量实际存放位置断开,即把盒子标签撕掉!所以unset($b)只是将$b和实际存放位置的联系给断开了,那么$b在栈内存中的空间就会被回收掉,但是这个盒子上还有$a这个标签,所以是不会被垃圾回收机制给回收的!所以你输出$a肯定依然还是能被找到(寻址正确)的,但是现在你输出$b的话就应该是找不到的了!
至于第二个为什么不是2,其他人的回答已经很清楚了!这个是前置运算符++$a和后置运算符$a++的区别!
++$a:先自增再执行对$a的一切操作
$a++:操作了$a后再自增


1.参考php文档对unset的定义

如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。 php unset

所以unset $b对$a无影响

2.参考php文档对递增递减运算符的定义

$a++ 后加 返回 $a,然后将 $a 的值加一。 php递增/递减运算符

$a++先返回1赋值给$b,所以$b为1


//$a++相当于
$b = $a;
$a += 1;

//++$a相当于
$a += 1;
$b = $a;

因此,$a++是先赋值后自增,所以$b的值为1

【热门文章】
【热门文章】