1)为什么 $a 结果是hello 而不是 undefined?
<code>$a = "hello"; $b =& $a; unset($b); $b = "world"; var_dump($a); // hello </code>
2)为什么 $a 结果是 1 而不是 2?
<code>$a = 1; $x =& $a; $b = $a++; var_dump($b); // 1 </code>
1)为什么 $a 结果是hello 而不是 undefined?
<code>$a = "hello"; $b =& $a; unset($b); $b = "world"; var_dump($a); // hello </code>
2)为什么 $a 结果是 1 而不是 2?
<code>$a = 1; $x =& $a; $b = $a++; var_dump($b); // 1 </code>
1.参考php文档对unset的定义
立即学习“PHP免费学习笔记(深入)”;
如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。 php unset
所以unset $b对$a无影响
2.参考php文档对递增递减运算符的定义
在整本书中我们所涉及许多的Flex框架源码,但为了简洁,我们不总是显示所指的代码。当你阅读这本书时,要求你打开Flex Builder,或能够访问Flex3框架的源码,跟随着我们所讨论源码是怎么工作及为什么这样做。 如果你跟着阅读源码,请注意,我们经常跳过功能或者具体的代码,以便我们可以对应当前的主题。这样能防止我们远离当前的主题,主要是讲解代码的微妙之处。这并不是说那些代码的作用不重要,而是那些代码处理特别的案例,防止潜在的错误或在生命周期的后面来处理,只是我们当前没有讨论它。有需要的朋友可以下载看看
0
$a++ 后加 返回 $a,然后将 $a 的值加一。 php递增/递减运算符
$a++先返回1赋值给$b,所以$b为1
1,b是a的快捷方式,马甲。快捷方式删除了不受影响。
2,$a++是表示语句执完才+1。你想得到2的结果改成$b = ++$a;或var_dump($a);即可
$b是对$a的引用,它们是两个不同的变量指向同一块物理地址。当执行unset($b)时,只是注销$b这个变量的指引而非注销物理地址中的值,所以这个时候$a依旧是原值hello.
这个问题你要理解$a++和++$a的区别。
<code>//$a++相当于 $b = $a; $a += 1; //++$a相当于 $a += 1; $b = $a; </code>
因此,$a++是先赋值后自增,所以$b的值为1
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后再自增
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号