经过xdebug来分析PHP引用
通过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:
<em>(refcount=2, is_ref=1)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
b:
<em>(refcount=2, is_ref=1)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
a:
<em>(refcount=1, is_ref=0)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
?
code2:
?
$a = "xiaoshenge";$b = &$a;xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );unset($a);xdebug_debug_zval( 'a' );xdebug_debug_zval( 'b' );
?结果:
a:
<em>(refcount=2, is_ref=1)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
b:
<em>(refcount=2, is_ref=1)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
b:
<em>(refcount=1, is_ref=0)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>
?
?
结合unix的硬链接来看(应该如下):
unset($a),只是销毁了a-x部分所以$b还在。
?
$b=&$b,不是指针那样,$b指向$a,(指针,貌似我的C都还给书了,要补习了)
?
面试感受:不能人云亦云,要自己动手,自己思考。PHP手册不能轻视,这个问题文档里面有。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

刚接触springboot项目,(1)发现断点debug调试无效,很郁闷,网上搜索解决办法。看到的都是一些很复杂的方案,说是远程调试,还要另外开端口号。这和传统的项目不一样,因此觉得没必要。所以经过摸索,发现有一种更加简单的方式,步骤如下:在pom文件的plugin部分加上一段配置:false这样就ok了;(2)关于SpringBoot项目中报错说web.xml文件ismissing的问题,因为传统的web项目都是要web.xml文件的,但是SpringBoot项目是可以不需要web.xml文件

是的,像XDebug这样的调试器会降低PHP服务器的性能。这就是调试器不放置在服务器环境中的原因。它们部署在不同的环境中,以避免不必要的开销。调试消息无法在已处于生产阶段的应用程序中显示。当将调试行为添加到服务器上,调试引擎附加到PHP进程。它开始接收消息以在断点处停止,但这不是必需的行为,因为它会给其他进程带来高性能打击,从而停止PHP解析器。另一方面,当调试器安装后,它们往往会在服务器中打开端口,因为它们不打算在生产环境中使用。在服务器中打开端口就像为黑客打开一扇窥探之门一样糟糕。

在PHP开发中,调试是不可避免的部分。为了帮助开发者更易于调试自己的代码,PHP8.0在其调试库中引入了一个非常有用的工具:Xdebug。本文将介绍Xdebug的一些主要功能,以及如何使用它来简化PHP调试的过程。Xdebug是一款开源调试工具,可以在PHP应用程序中捕获错误,并提供详细的错误堆栈跟踪信息,以及正在使用的变量。它可以帮助开发人员检测和解决代码

ThinkPHP6是一个流行的PHP框架,它使用了多种技术让开发变得更加便利。其中一个技术是调试工具,如Xdebug。在这篇文章中,我们将探讨如何在ThinkPHP6中使用Xdebug进行调试。安装与配置Xdebug在开始使用Xdebug前,首先需要安装和启用它。在php.ini文件中,可以添加以下配置:[xdebug]zend_extension=x

PHP是一种广泛应用于Web开发的编程语言。对于PHP的开发工具来说,选择一个合适的工具可以让开发者的工作变得更加高效和便捷。在本篇文章中,我们将探讨几种常见的PHP开发工具,包括集成开发环境(IDE)、文本编辑器以及调试工具等。一、集成开发环境(IDE)PhpStormPhpStorm是一款功能强大的PHP开发环境,由JetBrains开发。它不仅支持PH

用Vscode写过Node这类项目的小伙伴们都知道, 如果我们想要排查问题的时候大部分都是通过console.log进行打印来看问题在哪, 如果涉及到的问题比较复杂的时候会选择通过Vscode中...

PHP开发人员在开发过程中经常会遇到调试和测试问题。针对这些问题,我们可以使用一些工具来帮助我们更好地进行调试和测试。其中,Xdebug和PHPUnit就是PHP开发人员必不可少的两个工具。在本文中,我们将会介绍Xdebug和PHPUnit的基本用法,包括如何使用断点调试和单元测试。Xdebug,是PHP的一个调试器和分析器。通过X

1、先创建一个准备远程调试的Demo,注意构建项目的配置4.0.0org.springframework.bootspring-boot-starter-parent2.1.4.RELEASEcom.remote.testremote_test0.0.1-SNAPSHOTremote_testDemoprojectforSpringBoot1.8org.springframework.bootspring-boot-starterorg.springframework.bootspring-bo
