2

編集:(更新)

多分私の質問は十分に明確ではありませんでした。わかりました、このように言いましょう:

$arr["a"] = 10; 
var_dump($arr);
$arr["b"] =& $arr["a"];
var_dump($arr);

最初の var_dump は次を返します。

array
  'a' => int 10

2番目のものは次のように返されます:

array
  'a' => &int 10
  'b' => &int 10

unset($arr["a"]) すると、次のように返されます。

array
  'b' => int 10

ルールは、2 つ以上の変数が同じコンテンツを「指している」場合、var_dump はアンパサンド文字 (&) を使用して参照を表示することです。

$_SESSION の場合、 register_long_arrays = Offであっても、 $_SESSION は引き続き参照を示します。したがって、他の変数も同じコンテンツを指していることは明らかです。

言い換えれば、unset($_SESSION) した場合、リンクできる他の変数がまだどこかにあるということです。上記の例では、unset($arr["a"]) のときに、 $arr["z"] =& $arr["b"]のようなリンクを作成すれば、そのコンテンツを復元できます。

それで、私の最初の質問は、他の変数がどれか知っている人はいますか?そのような変数が存在しない可能性は非常に高いです...しかし、なぜPHP内部でその参照が表示されるのか疑問に思っていました。

ありがとうございました


(元の質問:)

たとえば、PHP でセッションを作成する場合:

session_start();
$_SESSION["name"] = "my name";

GLOBAL 変数を次のようにダンプします。

var_dump($GLOBALS);

次のようなものが表示されます。

  'HTTP_SESSION_VARS' => &
    array
      'name' => string 'my name' (length=7)
  '_SESSION' => &
    array
      'name' => string 'my name' (length=7)
  'HTTP_SERVER_VARS' => 
    array
      ...

ご覧のとおり、変数 $GLOBAL[HTTP_SESSION_VARS] と $_SESSION の両方が他のオブジェクトのコンテンツへの参照です...そのオブジェクトがどれか知っている人はいますか?

理論的には、両方の変数の設定を解除すると、どういうわけかそのコンテンツにアクセスできるはずです...手がかりはありますか?

ありがとうございました!

4

4 に答える 4

5

$HTTP_SESSION_VARSは古い、非推奨の名前です$_SESSION-- もう使用しないでください。

これらの$HTTP_*_VARS変数は必ずしも設定されているわけではありません:register_long_arrays構成ディレクティブが有効になっている場合にのみ設定されます。また、PHP の最近のバージョン(つまり、PHP 5.3)では廃止されています。


たとえば、PHP 5.3.2 を実行している私のサーバーでは、指定したコードの部分:

session_start();
$_SESSION["name"] = "my name";
var_dump($GLOBALS);

出力のみ( Cookieの存在を説明する 2 回の更新後PHPSESSID) :

array
  'GLOBALS' => 
    &array
  '_POST' => 
    array
      empty
  '_GET' => 
    array
      empty
  '_COOKIE' => 
    array
      'PHPSESSID' => string 'fnlujfapqg7kdk1ocve6ndb282' (length=26)
  '_FILES' => 
    array
      empty
  '_SESSION' => &
    array
      'name' => string 'my name' (length=7)

$HTTP_*_VARS変数のトレースなし:register_long_arrays構成ディレクティブが無効になっています。

于 2010-03-04T06:51:42.717 に答える
0

下位互換性のための HTTP_SESSION_VARS ではありませんか?

于 2010-03-04T06:50:52.850 に答える
0

まあ、PHP 5$HTTP_SESSION_VARSは互換性のためだけに残されています。代わりに使用することを強くお勧めします$_SESSION。PHPマニュアルから:

$HTTP_SESSION_VARS には同じ初期情報が含まれていますが、スーパーグローバルではありません。(注 > $HTTP_SESSION_VARS と $_SESSION は異なる変数であり、PHP はそれらをそのように処理します)

EDIT
あなたは「それはもう知ってる」って言うの!? では、あなたの質問は何ですか?$_SESSIONはオブジェクトではありません。結局のところ、それはスーパーグローバル変数である ARRAY です。メソッドもメンバーもありません。他の配列と同じように、その値にアクセスできます: $_SESSION['key'].

PHP のセッション管理をラップする独自の Session クラスを作成できます。session_set_save_handlerメソッドを使用して、組み込みのセッション管理をバイパスし、独自のロジックを実装します。

よろしく。

于 2010-03-04T06:52:13.067 に答える
0

これは、サーバーに保存される実際の一時ファイルであるセッション ファイルに保存されるデータの配列です。両方が指しているように、それは配列であり、「セッション」オブジェクトはありません。session_startこれらの値は、基本的にそのユーザーの PHPSESSID Cookie に基づいてファイルからデータをロードする実行時に入力されます。

于 2010-03-04T06:53:11.743 に答える