经过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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SpringBoot プロジェクトにブレークポイントを設定するときに無効なデバッグが発生する問題を解決する方法 SpringBoot プロジェクトにブレークポイントを設定するときに無効なデバッグが発生する問題を解決する方法 May 11, 2023 am 10:49 AM

Springboot プロジェクトは初めてです (1) ブレークポイントのデバッグが効果がないことがわかり、非常に落ち込んで、オンラインで解決策を探しました。私が目にしたのは、リモート デバッグであると言われているいくつかの非常に複雑なソリューションだけでしたが、追加の冒頭のスローガンも必要でした。これは従来のプロジェクトとは異なるので、必要ないと思います。そこでいろいろ調べてみたところ、もっと簡単な方法があることが分かりました 手順は以下の通りです: pom ファイルのプラグイン部分に設定を追加します: false でOKです; (2) SpringBoot プロジェクトのエラーについて従来の Web プロジェクトには web.xml ファイルが必要ですが、SpringBoot プロジェクトには web.xml ファイルが必要ないため、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 の主な機能のいくつかと、Xdebug を使用して PHP デバッグのプロセスを簡素化する方法を紹介します。 Xdebug は、PHP アプリケーションのエラーをキャプチャし、詳細なエラー スタック トレース情報と使用されている変数を提供できるオープン ソースのデバッグ ツールです。開発者がコードを検出してトラブルシューティングを行うのに役立ちます

ThinkPHP6 での Xdebug デバッグ テクノロジの使用 ThinkPHP6 での Xdebug デバッグ テクノロジの使用 Jun 20, 2023 pm 09:14 PM

ThinkPHP6 は、開発をより便利にするためにさまざまなテクノロジーを使用する人気のある PHP フレームワークです。そのようなテクノロジーの 1 つは、Xdebug などのデバッグ ツールです。この記事では、ThinkPHP6 でのデバッグに Xdebug を使用する方法を説明します。 Xdebug のインストールと構成 Xdebug の使用を開始する前に、まず Xdebug をインストールして有効にする必要があります。 php.ini ファイルに次の設定を追加できます: [xdebug]zend_extension=x

PHP の開発ツール PHP の開発ツール May 23, 2023 am 08:18 AM

PHP は、Web 開発で広く使用されているプログラミング言語です。 PHP 開発ツールの場合、適切なツールを選択することで、開発者の作業をより効率的かつ便利にすることができます。この記事では、統合開発環境 (IDE)、テキスト エディター、デバッグ ツールなど、いくつかの一般的な PHP 開発ツールについて説明します。 1. 統合開発環境 (IDE) PhpStorm PhpStorm は、JetBrains によって開発された強力な PHP 開発環境です。 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 を通じて出力することを知っています。関係する問題がより複雑な場合は、Through Vscode を選択します。 ...

PHP サーバー最適化の実践ガイド: 初心者から熟練者まで PHP サーバー最適化の実践ガイド: 初心者から熟練者まで Feb 19, 2024 pm 05:03 PM

1. PHP サーバーの最適化の概要 PHP サーバーの最適化とは、サーバー構成の調整、PHP コードの最適化、キャッシュの使用によって PHP サーバーのパフォーマンスと安定性を向上させることを指します。一般的な最適化方法は次のとおりです。 1. PHP コードの最適化 PHP コードの最適化は、PHP サーバーのパフォーマンスを向上させる最も直接的な方法の 1 つです。 PHP コードを最適化する方法には、以下が含まれます。 より高速なアルゴリズムとデータ構造を使用して不必要なデータベース クエリを回避し、キャッシュ手法を再利用してパフォーマンスを向上させる コード分析ツールを使用してパフォーマンスのボトルネックを見つける 2. PHP サーバー構成を最適化する PHP サーバー構成を最適化すると、パフォーマンスも向上します PHP サーバーのパフォーマンスも向上しますそして安定性。 PHP サーバー構成を最適化する方法には、PHP メモリ制限の増加、PHP プロセス数の調整、および最適化などがあります。

See all articles