首頁 後端開發 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++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

如何使用php擴充XDebug進行高效的調試和效能優化 如何使用php擴充XDebug進行高效的調試和效能優化 Jul 29, 2023 pm 08:57 PM

如何使用PHP擴展XDebug進行高效的調試和性能優化在開發和調試PHP應用程式時,我們經常會遇到各種各樣的問題,包括錯誤調用、低效的程式碼以及效能瓶頸。而XDebug是一個強大的PHP擴展,可以幫助我們快速定位、除錯和優化這些問題。本文將介紹如何使用XDebug進行高效的調試和效能優化,並提供一些程式碼範例。安裝與設定XDebug首先,我們需要安裝XDebug

帶你在VSCode中調試Nestjs專案(教學) 帶你在VSCode中調試Nestjs專案(教學) Apr 24, 2023 pm 05:53 PM

用Vscode寫過Node這類專案的小夥伴們都知道, 如果我們想要排查問題的時候大部分都是透過console.log進行列印來看問題在哪, 如果涉及到的問題比較複雜的時候會選擇透過Vscode中...

PHP伺服器優化實戰指南:從入門到精通 PHP伺服器優化實戰指南:從入門到精通 Feb 19, 2024 pm 05:03 PM

一、PHP伺服器最佳化概述PHP伺服器最佳化是指透過調整伺服器配置、最佳化php程式碼和使用快取等方法來提高PHP伺服器的效能和穩定性。常見的最佳化方法包括:1.最佳化PHP程式碼最佳化PHP程式碼是提高PHP伺服器效能最直接的方法之一。優化PHP程式碼的方法包括:使用更快的演算法和資料結構避免不必要的資料庫查詢和循環使用快取技術來提高效能使用程式碼分析工具來發現效能瓶頸2、最佳化PHP伺服器配置最佳化PHP伺服器配置也可以提高PHP伺服器的效能和穩定性。最佳化PHP伺服器配置的方法包括:增加PHP記憶體限制調整PHP進程數優

See all articles