PHP'nin gerçek OTURUM nesne

4 Cevap php

EDIT: (GÜNCEL)

Belki de soru yeterince açık değildi. Tamam, bu şekilde koymak sağlar:

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

İlk var_dump döner:

array
  'a' => int 10

Ikinci dönerken:

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

I unset($arr["a"]) o dönecektir:

array
  'b' => int 10

Kural aynı içeriği var_dump 2 veya daha fazla değişken "puan" bir ve işareti (&) karakteri ile referans olacağı zaman vardır.

Bile $ _SESSION, durumunda register_long_arrays = Off $ _SESSION hala bir referans gösterir. Yani diğer değişken de aynı içeriğe işaret olduğu açıktır.

I ($ _SESSION) yoketmek, diğer bir deyişle, ile bağlantılı olabilir, diğer değişken bir yerde hala var. Yukarıdaki örnekte, bir bağlantı, böyle bir şey oluşturmak eğer unset($arr["a"]) Hala bu içeriği kurtarabilirsiniz zaman: $arr["z"] =& $arr["b"].

Yani, benim özgün soru oldu, herkes bu diğer değişken HANGİ biliyor? Bu tür değişken var yok çok muhtemel ... ama PHP içinde bu referansı gösterir neden merak ediyordum.

Teşekkür ederim


(Orijinal soru :)

Eğer PHP bir oturum oluşturduğunuzda, örneğin:

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

ile GLOBAL değişkenleri dökümü:

var_dump($GLOBALS);

Senin gibi bir şey göreceksiniz:

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

As you can see, both variables $GLOBAL[HTTP_SESSION_VARS] and $_SESSION are references to other object's content... Do anyone knows which is that object?

In theory, if I unset both variables, somehow It must be possible to access that content... any clue?

Teşekkür ederim!

4 Cevap

$HTTP_SESSION_VARS is the old, deprecated, name for $_SESSION - Artık o kullanmanız gerekir.

Bu $HTTP_*_VARS değişkenleri mutlaka ayarlanmamış: register_long_arrays configuration directive is enabled -- and, with recent versions of PHP (i.e. PHP 5.3), bu onaylanmaz ise sadece olacaktır.


For instance, on my server, which is running PHP 5.3.2, the portion of code that you gave :

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

Sadece çıkışları (after a couple of refresh, which explains the presence of the PHPSESSID cookie) :

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)

Herhangi bir $HTTP_*_VARS değişkenin hiçbir iz: register_long_arrays yapılandırma yönergesi devre dışı bırakılır.

Geriye dönük uyumluluk için HTTP_SESSION_VARS değil mi?

Bu sunucuda depolanan gerçek bir geçici dosya olan oturum dosyasında, depolanan verilerin bir dizi var. Her ikisi de, bir dizi var işaret gibi, hayır 'Session' nesne yoktur. Temelde bu kullanıcı için PHPSESSID çerez dayalı dosyadan veri yükler session_start hangi çalıştırdığınızda bu değerler doldurulur.

Peki, PHP 5 $HTTP_SESSION_VARS sadece uyumluluk için tutulur. Sen şiddetle yerine $_SESSION kullanımı teşvik edilmektedir. PHP manuel:

$HTTP_SESSION_VARS contains the same initial information, but is not a superglobal. (Note > that $HTTP_SESSION_VARS and $_SESSION are different variables and that PHP handles them as such)

EDIT
You say you "already know that"!? What's your question then? $_SESSION is NOT an object, after all, it's an ARRAY, a superglobal variable. No methods, no members. You can access it's values like you would with any other array: $_SESSION['key'].

PHP'nin oturum yönetimi sarar kendi Seans sınıf yazabilirsiniz. Oturum yönetimi inşa bypass ve kendi mantığını uygulamak için session_set_save_handler yöntemini kullanın.

Saygılar.