Konrad L. M. Rudolph: Array in $_SESSION ablegen

Beitrag lesen

Moin,

ich habe Probleme, ein Array in der $_SESSION-Variable anzusprechen.

$_SESSION ist hierbei in eine Klasse gekapselt und ich benutze Interzeptoren, um __get, __set, __unset und __isset an $_SESSION weiterzuleiten. Leider macht mir PHP einen Strich durch die Rechnung, weil auf diese Weise lediglich Kopien manipuliert werden, wenn ich einen Schreibzugriff auf das Array ausführen möchte, wie beispielsweise in folgendem Code:

// $session kapset die $_SESSION-Variable  
  
$session->flash = array();  
  
// … gaanz woanders:  
  
$session->flash['xyz'] = 'abc';

Im Moment behelfe ich mir mit folgendem offensichtlichen Workaround:

$flash = $session->flash;  
$flash['xyz'] = 'abc';  
$session->flash = $flash;

Diesen Weg möchte ich aber vermeiden, da das 'flash'-Array sehr groß werden kann (um genau zu sein können dort große Mengen an Binärdaten abgelegt sein) und das andauernde Umkopieren dieser Daten möchte ich um jeden Preis vermeiden. Es ist schon schlimm genug, dass ich die überhaupt in der Session ablegen muss (das ist aber leider so).

Gibt es da eine gute Lösung für? Kann man Referenzen auf $_SESSION-Variablen anlegen? Die Doku schweigt sich hierzu aus. Ich würde vermuten, dass es geht, möchte aber nicht in subtile Schwierigkeiten rennen.

Folgender Code *scheint* zu funktionieren. Any comments?

<?php  
// Session.php  
  
class Session {  
    private static $__instance;  
  
    protected function __construct() {  
        session_start();  
    }  
  
    private function __clone() { }  
  
    public static function getInstance() {  
        if (self::$__instance == null) {  
            self::$__instance = new Session();  
        }  
        return self::$__instance;  
    }  
  
    public function __isset($key) {  
        return isset($_SESSION[$key]);  
    }  
  
    public function __get($key) {  
        return &$_SESSION[$key];  
    }  
  
    public function __set($key, &$value) {  
        $_SESSION[$key] = $value;  
    }  
  
    public function __unset($key) {  
        unset($_SESSION[$key]);  
    }  
}  
  
?>

lg, Konrad -

--
Der Genitiv ist des Dativs Tod