0

参照に関する PHP のマニュアルを読んでいて、何かが混乱しています。参照はメモリアドレスへのポインタではなく、むしろ...

代わりに、シンボル テーブルのエイリアスです。

参照がメモリアドレスを指すシンボルテーブルエントリを指している場合、これは本質的にポインタではありませんか?

編集:

いくつかの素晴らしい答え。これをここにポップしたいだけです...別の変数が指している変数の設定を解除するにはどうすればよいですか?

$var = "text";
$ref =& $var;
unset($ref);

これが機能するように見えます$var.GCがそれを削除するように、設定も解除する必要があります.

4

4 に答える 4

5

重要なのは、Cなどの他の言語のように、「ポインタ」に対して算術演算を実行できないことです。これらの他の言語では、「ポインタ++」のような操作を実行できるため、メモリ内で一歩前進できます。これはPHPでは不可能です。

于 2010-01-14T00:02:48.980 に答える
4

unset() は値ではなく参照を実際に削除するため、参照を介して変数を設定解除することはできません。次に、ガベージ コレクターは、元の変数名を含め、参照を持たないすべての変数をクリーンアップします。

そして、これは良いことです。プライベート変数で 3 番目のオブジェクトへの参照を保持している 2 つのオブジェクトを想像してください。1 つのオブジェクトがプライベート変数の設定を解除しても、他のオブジェクトは影響を受けません。

参照を介して設定を解除できる場合、パブリック/プライベート モデルに違反します。

于 2010-01-14T01:32:25.960 に答える
2

素晴らしいPHPリファレンスチュートリアルがあり、PHPドキュメント自体(あえぎ)よりも詳細にすべてを説明する必要があります。変数の作成時に何が起こるかを説明することさえできます。

PHPは、一般に単にzvalと呼ばれる_zval_structと呼ばれる構造体を介して変数値を内部的に実装します。値とそのタイプに関する情報を格納することに加えて、zvalはrefcountも指定します。refcountは、値への参照の数をカウントし、ガベージコレクターの操作に不可欠であり、使用されなくなったときにメモリを解放できるようにします。

PHPでの参照は、単に別の変数と同じzvalに対応する変数です。参照は、等号の後にアンパサンドを使用して動作する特別な形式の割り当てを使用して明示的に作成できます。

于 2010-01-14T00:02:51.267 に答える
0

PHP グローバルまたは $GLOBALS

@Artefacto から: 「関数内で、グローバル変数の設定を解除する場合は、グローバル $varname; unset($varname); ではなく、unset($GLOBALS['varname']) を使用する必要があります。」

于 2012-12-14T17:59:48.703 に答える