`
xiaoshenge
  • 浏览: 169750 次
  • 性别: Icon_minigender_1
  • 来自: 十堰
社区版块
存档分类
最新评论

通过xdebug来分析PHP引用

阅读更多

一直没搞懂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
1
1
分享到:
评论

相关推荐

    php xDebug调试组件

    总结来说,Xdebug是PHP开发者的得力助手,它使得代码调试不再困难,性能分析更加直观。合理利用Xdebug,可以显著提升开发质量和效率。在实际工作中,熟练掌握Xdebug的使用技巧,是成为一名优秀PHP开发者的必备技能之...

    php_xdebug-2.7.2-7.1-nts-vc14-x64.zip

    总的来说,Xdebug 是 PHP 开发不可或缺的工具之一,它能极大地提高开发效率,通过其丰富的特性,如变量查看、性能分析、远程调试等,帮助开发者快速定位和修复问题。这个压缩包提供了一个离线安装的选项,确保在官方...

    php性能优化分析工具XDebug 大型网站调试工具

    一、安装配置 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/...

    php_xdbug1_4_3_20191030.zip

    5. **性能分析**:通过Xdebug的profiler功能,可以生成cachegrind.out文件,使用工具如KCacheGrind进行分析,找出性能瓶颈。 配合Chrome浏览器的Xdebug Helper插件,开发者可以更方便地启用和管理Xdebug的调试会话...

    PHP中文调试技术手册(PHP-Debug-Manual-public)

    Xdebug是PHP的扩展,它提供了代码覆盖率分析、堆栈追踪和性能分析等功能。 4.2.1 安装配置: 介绍Xdebug的安装和配置方法,以便于开始性能分析。 4.3 APD(Advanced PHP Debugger): APD是一个PHP扩展,用于分析脚本...

    php7.2开发手册.zip

    1. **Xdebug扩展**:PHP 7.2与Xdebug的兼容性更好,提供了更丰富的调试和分析工具。 2. **错误日志**:改进了错误日志记录,便于定位和解决问题。 通过阅读“PHP 7.2开发手册”,开发者可以深入了解这一版本的每个...

    高性能PHP应用开发pdf

    1. **性能优化基础**:书中首先会介绍性能优化的基本理念,包括理解CPU、内存、网络等资源对PHP应用的影响,以及如何通过性能分析工具(如Xdebug, New Relic)来定位性能瓶颈。 2. **PHP语言特性与性能**:探讨PHP...

    PHP-Debug-Manual-public

    手册描述了Xdebug的安装配置过程以及如何使用它来进行性能分析。此外,还介绍了APD(Advanced PHP Debugger)和Xhprof,这两者都是用于性能分析的PHP扩展,各自具有独特的优势。 单元测试是开发过程中不可或缺的一...

    php调试程序技术

    然而,为了更精确地分析性能瓶颈,`Xdebug`和`APD(Advanced PHP Debugger)`提供了更强大的功能。`Xdebug`可以生成代码覆盖报告和性能分析,而`APD`则提供了交互式纠错和堆栈追踪能力。 `Xhprof`是Facebook开源的一...

    10天学会php

    虽然描述中没有详细展开,但通常PHP的调试可以通过错误报告、日志分析和使用像Xdebug这样的调试工具来实现。描述中提到了使用Apache Web Server和MySQL作为Web服务器和数据库,这构成了一个常见的LAMP(Linux, ...

    PHP opdump OP代码

    理解OP代码不仅能够提升对PHP内部机制的理解,还可以利用如Xdebug这样的扩展进行更高级的分析。Xdebug提供了更详细的OP代码分析,包括变量状态和执行时间,这对于性能调优尤其有用。 总的来说,掌握`opdump`和其他...

    php调试手册

    通过记录函数执行时间来分析性能瓶颈。 ```php $start_time = microtime(true); // 执行操作 $end_time = microtime(true); $execution_time = $end_time - $start_time; echo "Execution Time: " . $execution_time...

    php_python调试工具

    安装Xdebug后,可以配合IDE如PhpStorm进行集成调试,实现远程调试,使开发者能够远程分析代码问题。 2. PHP Debug Bar:这是一个轻量级的PHP调试工具,可以在页面底部生成一个包含各种性能指标和错误信息的条形栏,...

    提高php内存.zip

    对于复杂的应用,可以使用像Xdebug这样的扩展进行内存分析,找出消耗内存最多的部分。 9. **分块处理大数据**: 当处理大数据集时,不要一次性加载所有数据,而是采用分批处理或流式处理的方式,以减少内存占用。...

    深入探讨PHP中的内存管理问题

    开发过程中,可以利用内存分析工具(如Xdebug的内存分析报告、内存泄漏检测工具)来检查和定位内存泄漏问题,帮助优化代码。 总之,理解PHP的内存管理机制并采取适当的优化策略,对于编写高效且稳定的长期运行服务...

    eclipse for php win32

    2. **代码导航**:通过代码跳转、查找引用和定义,以及查看类层次结构,使开发者能快速理解代码结构。 3. **错误检查与警告**:Eclipse实时分析代码,指出可能的语法错误、未声明的变量或函数,帮助保持代码质量。 ...

    PHP面试大全

    - PHP性能分析:使用Xdebug或其他工具进行性能分析和调优。 - 错误调试:学会使用var_dump、print_r、error_reporting等进行错误排查。 通过深入学习和实践这些知识点,PHP开发者不仅能应对面试中的各种挑战,还...

    PHP面试题(笔试题)

    11. **性能优化**:理解内存管理和变量作用域的影响,使用性能分析工具如Xdebug,以及如何优化代码结构以提高效率。 12. **设计模式**:熟悉常见的设计模式,如单例、工厂、观察者、装饰器等,并能将它们应用于实际...

Global site tag (gtag.js) - Google Analytics