ホームページ >バックエンド開発 >PHPチュートリアル >xdebug を使用して PHP 参照を分析する

xdebug を使用して PHP 参照を分析する

WBOY
WBOYオリジナル
2016-06-13 13:17:37884ブラウズ

xdebug
を通じて PHP 参照を分析する

私はphpのリファレンスを全く理解していませんでしたが、今日のインタビュー中に再度遭遇しましたが、xdebugの助けを借りて少し理解できたので記録します。

?

コード1:

?

$a = "xiaoshenge";
$b = &$a;
unset($b);
echo "b=$b";
echo "a=$a";

結果: b=a=xiaoshenge

?

コード2:

$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 ファイル システムのハードリンク と考えることができます。

?

参照解除: 参照の設定を解除すると、変数名と変数の内容の間のバインドが解除されるだけです。これは、変数の内容が破壊されることを意味するものではありません。 例:

?

9e1f025c9738a7fe8291978bb45794ca

?は設定解除されません?$b、のみ ?$aこれと Unix の ?unlink? 呼び出しとの類似は理解に役立つかもしれません。

?

推論:

?

このドキュメントでは、「参照は Unix ファイル システムではハードリンクと見なすことができる」と紹介されています。参照 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=150986? での紹介:

ハードリンク は、ファイルのコピーを提供し、2 つの間の接続を確立します。そのうちの 1 つを変更すると、それに接続されているファイルも同時に変更されます。 [color=red][/color] のいずれかを削除しても、残りのファイルは影響を受けません。 ?

ソフトリンク は、ソースファイルの「ショートカット (Windows から一般的な単語を借用)」を新しい場所に作成するだけです。ファイルが削除されると、シンボルが接続されたファイルはパッシブウォーターになります -> ファイル名だけが残ります。 もちろん、この接続を削除してもソースファイルには影響しませんが、接続されたファイルの使用と参照はソースファイルを直接呼び出します。 。 ?

?

xdebug を通じて zval コンテナーの変更を確認します:

?

コード1:

?

$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>

答え:

<em>(refcount=1, is_ref=0)</em>,<small>string</small> <span style="color: #cc0000;">'xiaoshenge'</span> <em>(length=10)</em>

?

コード2:

?

$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 までご連絡ください。