一直没搞懂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
分享到:
相关推荐
总结来说,Xdebug是PHP开发者的得力助手,它使得代码调试不再困难,性能分析更加直观。合理利用Xdebug,可以显著提升开发质量和效率。在实际工作中,熟练掌握Xdebug的使用技巧,是成为一名优秀PHP开发者的必备技能之...
总的来说,Xdebug 是 PHP 开发不可或缺的工具之一,它能极大地提高开发效率,通过其丰富的特性,如变量查看、性能分析、远程调试等,帮助开发者快速定位和修复问题。这个压缩包提供了一个离线安装的选项,确保在官方...
一、安装配置 1、下载PHP的XDebug扩展...、在Linux下编译安装XDebug 引用 tar -xzf xdebug-2.0.0RC3.gz cd xdebug-2.0.0RC3 /usr/local/php/bin/phpize ./configure –enable-xdebug cp modules/xdebug.so /usr/local/...
5. **性能分析**:通过Xdebug的profiler功能,可以生成cachegrind.out文件,使用工具如KCacheGrind进行分析,找出性能瓶颈。 配合Chrome浏览器的Xdebug Helper插件,开发者可以更方便地启用和管理Xdebug的调试会话...
Xdebug是PHP的扩展,它提供了代码覆盖率分析、堆栈追踪和性能分析等功能。 4.2.1 安装配置: 介绍Xdebug的安装和配置方法,以便于开始性能分析。 4.3 APD(Advanced PHP Debugger): APD是一个PHP扩展,用于分析脚本...
1. **Xdebug扩展**:PHP 7.2与Xdebug的兼容性更好,提供了更丰富的调试和分析工具。 2. **错误日志**:改进了错误日志记录,便于定位和解决问题。 通过阅读“PHP 7.2开发手册”,开发者可以深入了解这一版本的每个...
1. **性能优化基础**:书中首先会介绍性能优化的基本理念,包括理解CPU、内存、网络等资源对PHP应用的影响,以及如何通过性能分析工具(如Xdebug, New Relic)来定位性能瓶颈。 2. **PHP语言特性与性能**:探讨PHP...
手册描述了Xdebug的安装配置过程以及如何使用它来进行性能分析。此外,还介绍了APD(Advanced PHP Debugger)和Xhprof,这两者都是用于性能分析的PHP扩展,各自具有独特的优势。 单元测试是开发过程中不可或缺的一...
然而,为了更精确地分析性能瓶颈,`Xdebug`和`APD(Advanced PHP Debugger)`提供了更强大的功能。`Xdebug`可以生成代码覆盖报告和性能分析,而`APD`则提供了交互式纠错和堆栈追踪能力。 `Xhprof`是Facebook开源的一...
虽然描述中没有详细展开,但通常PHP的调试可以通过错误报告、日志分析和使用像Xdebug这样的调试工具来实现。描述中提到了使用Apache Web Server和MySQL作为Web服务器和数据库,这构成了一个常见的LAMP(Linux, ...
理解OP代码不仅能够提升对PHP内部机制的理解,还可以利用如Xdebug这样的扩展进行更高级的分析。Xdebug提供了更详细的OP代码分析,包括变量状态和执行时间,这对于性能调优尤其有用。 总的来说,掌握`opdump`和其他...
通过记录函数执行时间来分析性能瓶颈。 ```php $start_time = microtime(true); // 执行操作 $end_time = microtime(true); $execution_time = $end_time - $start_time; echo "Execution Time: " . $execution_time...
安装Xdebug后,可以配合IDE如PhpStorm进行集成调试,实现远程调试,使开发者能够远程分析代码问题。 2. PHP Debug Bar:这是一个轻量级的PHP调试工具,可以在页面底部生成一个包含各种性能指标和错误信息的条形栏,...
对于复杂的应用,可以使用像Xdebug这样的扩展进行内存分析,找出消耗内存最多的部分。 9. **分块处理大数据**: 当处理大数据集时,不要一次性加载所有数据,而是采用分批处理或流式处理的方式,以减少内存占用。...
开发过程中,可以利用内存分析工具(如Xdebug的内存分析报告、内存泄漏检测工具)来检查和定位内存泄漏问题,帮助优化代码。 总之,理解PHP的内存管理机制并采取适当的优化策略,对于编写高效且稳定的长期运行服务...
2. **代码导航**:通过代码跳转、查找引用和定义,以及查看类层次结构,使开发者能快速理解代码结构。 3. **错误检查与警告**:Eclipse实时分析代码,指出可能的语法错误、未声明的变量或函数,帮助保持代码质量。 ...
- PHP性能分析:使用Xdebug或其他工具进行性能分析和调优。 - 错误调试:学会使用var_dump、print_r、error_reporting等进行错误排查。 通过深入学习和实践这些知识点,PHP开发者不仅能应对面试中的各种挑战,还...
11. **性能优化**:理解内存管理和变量作用域的影响,使用性能分析工具如Xdebug,以及如何优化代码结构以提高效率。 12. **设计模式**:熟悉常见的设计模式,如单例、工厂、观察者、装饰器等,并能将它们应用于实际...