ホームページ >バックエンド開発 >PHPチュートリアル >xdebug を使用して PHP 参照を分析する
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 ドキュメントの参照の紹介:
?
?
?
?
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 マニュアルを過小評価することはできません。この問題はドキュメントに含まれています。