Thomas: $HTTP_SESSION_VARS =& $_SESSION

Hallo zusammen.

Ich versuche gerade PHP-Skripte von ~2003 in einer neueren PHP-Umgebung zum Laufen zu bringen.

Viele Probleme habe ich bereits dadurch beheben können:

$HTTP_POST_VARS   = !empty($HTTP_POST_VARS)   ? $HTTP_POST_VARS   : $_POST;  
$HTTP_GET_VARS    = !empty($HTTP_GET_VARS)    ? $HTTP_GET_VARS    : $_GET;  
$HTTP_COOKIE_VARS = !empty($HTTP_COOKIE_VARS) ? $HTTP_COOKIE_VARS : $_COOKIE;  
$HTTP_SERVER_VARS = !empty($HTTP_SERVER_VARS) ? $HTTP_SERVER_VARS : $_SERVER;  
$HTTP_POST_FILES  = !empty($HTTP_POST_FILES)  ? $HTTP_POST_FILES  : $_FILES;

Allerdings gibt es ein Problem bei Sessions.

Hier mal ein Beispiel zur Verdeutlichung:

<?php  
  function init_session() { // Funktion die von jedem Skript vor der Session-Benutzung aufgerufen wird  
    session_start();  
    global $HTTP_SESSION_VARS;  
    $HTTP_SESSION_VARS =& $_SESSION; // Referenzzuweisung, $_SESSION ist global, daher müsste es auch nach dem Funktionsscope noch exisiteren (so meine Theorie)  
  }  
  init_session(); // Aufruf der Funktion  
  if (empty($HTTP_SESSION_VARS['value'])) { // Test  
    $HTTP_SESSION_VARS['value'] = 1;  
  }  
?>

Zum Ende müsste dann also $HTTP_SESSION_VARS['value'] auf 1 gesetzt sein. Da $HTTP_SESSION_VARS eine Referenz von $_SESSION sein soll, müsste also eigentlich auch $_SESSION['value'] den Wert 1 enthalten.
Tut es aber leider nicht. Nach dem Funktionsaufruf sind $HTTP_SESSION_VARS und $_SESSION 2 Arrays die nichts mehr miteinander zu tun haben.

Ich nehme an, dass PHP dem Nutzer vorgaukelt, dass das Array wirklich global ist und es in Wahrheit für jeden Scope neu erzeugt. Weiß jemand mehr?

Und hat jemand eine Idee wie man das Problem lösen kann?

Danke!
Thomas

  1. Tach.

    Viele Probleme habe ich bereits dadurch beheben können:

    $HTTP_POST_VARS   = !empty($HTTP_POST_VARS)   ? $HTTP_POST_VARS   : $_POST;

    $HTTP_GET_VARS    = !empty($HTTP_GET_VARS)    ? $HTTP_GET_VARS    : $_GET;
    $HTTP_COOKIE_VARS = !empty($HTTP_COOKIE_VARS) ? $HTTP_COOKIE_VARS : $_COOKIE;
    $HTTP_SERVER_VARS = !empty($HTTP_SERVER_VARS) ? $HTTP_SERVER_VARS : $_SERVER;
    $HTTP_POST_FILES  = !empty($HTTP_POST_FILES)  ? $HTTP_POST_FILES  : $_FILES;

      
    Und das ist einfacher als das Ersetzen von $HTTP\_GET\_VARS durch $\_GET usw.?  
      
      
    
    > [...] Zum Ende müsste dann also $HTTP\_SESSION\_VARS['value'] auf 1 gesetzt sein. Da $HTTP\_SESSION\_VARS eine Referenz von $\_SESSION sein soll, müsste also eigentlich auch $\_SESSION['value'] den Wert 1 enthalten.  
    > Tut es aber leider nicht. Nach dem Funktionsaufruf sind $HTTP\_SESSION\_VARS und $\_SESSION 2 Arrays die nichts mehr miteinander zu tun haben.  
      
    <http://www.php.net/manual/en/language.references.whatdo.php> (speziell der große Kasten mit dem Titel "Warning")  
    <http://www.php.net/manual/en/language.references.arent.php>  
    
    -- 
    Always remember that you are unique. Just like everybody else.  
    
    
  2. Tach.

    Falls es sich nur um eine vorübergehende Reparatur handelt, könnte die Verwendung von register_long_arrays eventuelle Zeit sparen. Beachte aber auch den Hinweis zu dieser Direktive:

    "This feature has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged."

    --
    Always remember that you are unique. Just like everybody else.
    1. Hi,

      Falls es sich nur um eine vorübergehende Reparatur handelt, könnte die Verwendung von register_long_arrays eventuelle Zeit sparen. Beachte aber auch den Hinweis zu dieser Direktive:

      Ja, es handelt sich tatsächlich um eine Reparatur und register-long-arrays ist genau das was ich gesucht habe.

      Danke!