一直没搞懂php的引用,今天面试的时候又碰到了,借助xdebug貌似理解了一点,记录一下。
code1:
$a = "xiaoshenge";
$b = &$a;
unset($b);
echo "b=$b";
echo "a=$a";
结果:b=a=xiaoshenge
code2:
$a = "xiaoshenge";
$b = &$a;
unset($a);
echo "b=$b";
echo "a=$a";
结果:b=xiaoshengea=
猜测:
面试的时候是code1,由于没搞懂PHP的引用当时就猜测的写了b=a=,其实这与我把引用跟c里面的指针搞混了有关。回来之后,调试了一下code2,然后彻底迷惑了,于是求救与PHP文档。
PHP文档中对于引用的介绍:
引用是什么:在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
取消引用:当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
<?php
$a = 1;
$b =& $a;
unset($a);
?>
不会 unset $b,只是 $a。再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。
推断:
文档里面有介绍”引用可以被当作是unix文件系统中的hardlink“,参考
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=150986 中的介绍:
硬连接是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中[color=red]任意一个[/color]其余的文件将不受影响。
软连接也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。
通过xdebug来看zval容器中的变化:
code1:
$a = "xiaoshenge";
$b = &$a;
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
unset($b);
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
结果:
a:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
a:
(refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
code2:
$a = "xiaoshenge";
$b = &$a;
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
unset($a);
xdebug_debug_zval( 'a' );
xdebug_debug_zval( 'b' );
结果:
a:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=2, is_ref=1),string 'xiaoshenge' (length=10)
b:
(refcount=1, is_ref=0),string 'xiaoshenge' (length=10)
结合unix的硬链接来看(应该如下):
unset($a),只是销毁了a-x部分所以$b还在。
$b=&$b,不是指针那样,$b指向$a,(指针,貌似我的C都还给书了,要补习了)
面试感受:不能人云亦云,要自己动手,自己思考。PHP手册不能轻视,这个问题文档里面有。
- 大小: 27.7 KB
分享到:
相关推荐
备注:压缩包中的PHP8.1.1默认已经集成了php_xdebug-3.2.1-8.1-vs16-nts-x86_64.dll文件并已重命名为php_xdebug.dll。 2.配置用户环境变量 将PHP8.1所在目录添加进用户变量:D:\phpstudy_pro\Extensions\...
XDebug For Php5.5 用来调试PHP的工具,和Eclipse配合使用
利用xdebug分析php程序,找出瓶颈
php7 的 xdebug 扩展
Xdebug是一款专门针对php语言的开源调试工具,我花了一天的时间收集整理了所有Xdebu and Xdebug对应的php版本,希望对大家有所帮助。
php_xdebug
我是用wampServer2.2的环境的,环境本身自带了对应的xdebug,只需要修改php.ini的配置就可以了。但是php.ini文件要找对,我一开始就是找错了文件,所以配了好久都不生效。 wampServer使用的php配置文件一般都放在...
php100-102PHP5.3 Xdebug 错误分析与性能调试 .rar
很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至...
zend_extension_ts="D:\php\ext\php_xdebug-2.0.3-5.2.5.dll" xdebug.auto_trace=Off xdebug.collect_params=On xdebug.collect_return=On xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_...
PHP的XDebug插件,版本为VC14版。支持32位与64位。用于支持PHP的debug功能。
前段时间帮别人修改个项目,心血来潮搭建个phptorm2019.1.2+apache2.4+php7+xdebug2.9.1的开发环境。 php2019.1.2照常安装。 apache2.4+php7+xdebug2.9.1 已经配置好,只要修改相关目录即可。 其中的phptorm2019....
php_xdebug-2.5.5-5.6-vc11-x86_64.dll php_xdebug-2.5.5-5.6-vc11-x86_64.dll php_xdebug-2.5.5-5.6-vc11-x86_64.dll
NetBeans,XDebug调试PHP教程
包括: php_xdebug-2.1.0-5.3-vc6.dll php_xdebug-2.1.2-5.2-vc6.dll WinCacheGrind.exe 以及配置示例
xdebug插件dll下载
php_xdebug-2.1.2-5.3-vc9.dll php_xdebug-2.1.2-5.3-vc9.dll php_xdebug-2.1.2-5.3-vc9.dll php_xdebug-2.1.2-5.3-vc9.dll
php_xdebug_vc11-x86_64.dll php_xdebug_vc11-x86_64.dll