首页 后端开发 php教程 经过xdebug来分析PHP引用

经过xdebug来分析PHP引用

Jun 13, 2016 am 10:41 AM
debug unset xdebug

通过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手册不能轻视,这个问题文档里面有。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SpringBoot项目设置断点debug调试无效怎么解决 SpringBoot项目设置断点debug调试无效怎么解决 May 11, 2023 am 10:49 AM

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

在生产服务器上启用XDebug会使PHP变慢吗? 在生产服务器上启用XDebug会使PHP变慢吗? Sep 22, 2023 pm 10:41 PM

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

PHP8.0中的调试库:Xdebug PHP8.0中的调试库:Xdebug May 14, 2023 am 08:09 AM

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

在ThinkPHP6中使用Xdebug调试技术 在ThinkPHP6中使用Xdebug调试技术 Jun 20, 2023 pm 09:14 PM

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

PHP中的开发工具 PHP中的开发工具 May 23, 2023 am 08:18 AM

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

带你在VSCode中调试Nestjs项目(教程) 带你在VSCode中调试Nestjs项目(教程) Apr 24, 2023 pm 05:53 PM

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

PHP开发:使用 Xdebug 和 PHPUnit 断点调试和单元测试 PHP开发:使用 Xdebug 和 PHPUnit 断点调试和单元测试 Jun 15, 2023 pm 07:55 PM

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

如何在springboot中使用IDEA远程连接Debug 如何在springboot中使用IDEA远程连接Debug May 10, 2023 pm 11:55 PM

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

See all articles