Frage

Ist es sicher, den superglobalen $_SESSION mit einem speziellen Sitzungsobjekt zu überschreiben?

class SessionObject implements ArrayAccess { ... }

...

// Session data has just been deserialised from store.
$_SESSION = new SessionObject( $session_data );

...

// Using session object...
$_SESSION['key'] = 27;
$x = $_SESSION->get_data('key2', 'default-value');

War es hilfreich?

Lösung

Obwohl dies funktionieren mag, halte ich es nicht für vernünftiges Verhalten.Das Prinzip der geringsten Überraschung gilt meiner Meinung nach sowohl für die Programmierung als auch für das Design der Benutzeroberfläche.Wenn Sie das Standardverhalten von $_SESSION in Ihrem Skript überschreiben, wird dies einen zukünftigen Programmierer verwirren, der sich mit Ihrem Code befassen muss.

Ich denke, es ist ein Hack - und ein unangenehmer -, die superglobale Natur von $_SESSION auf diese Weise zu missbrauchen.

Meiner Meinung nach wäre es besser, eine Klasse mit statischen Methoden zu schreiben, um Ihre Daten abzurufen und festzulegen:

class Session {
    public function get($key, $defaultValue = null) {
        // do some code to get the value for $key, and return $defaultValue if there is none
    }

    public function set($key, $value) {
        // do some code to set $key
    }
}

Sie können dann mit Session::get('someKey') oder Session::get('someKey', 'default') und Session::set('someKey', 'someValue') darauf zugreifen.

Da Klassen von Natur aus global sind, können Sie von überall in Ihrem Code darauf zugreifen.Dies ist weniger überraschend und führt zu weniger Verwirrung auf der ganzen Linie.

Wenn Sie aus Entwurfsgründen Objektmethoden verwenden wollten, ist es möglicherweise am besten, das Singleton-Muster zu implementieren.

Andere Tipps

Scheint mir ein wenig riskant zu sein.Haben Sie die session_set_save_handler -Methode überprüft?Sie können Ihren eigenen Handler für die Verwendung festlegen, anstatt zu versuchen, $ _SESSION zu überschreiben.

Wenn Sie sich selbst mit der Sitzungsverwaltung und -speicherung befassen, können Sie tun, was Sie möchten.Das Superglobal $ _SESSION kann in dieser Hinsicht wie jede andere Variable verwendet werden.

Es ist nur der Standard-Sitzungshandler von PHP, der ihn speziell behandelt.Es erwartet dort ein normales Array (und darf auch nicht numerisch indiziert werden).Wenn Sie das erneut verwenden möchten, müssen Sie das ausgefallene ArrayObject-Wrapping mit einem Shutdown-Aufruf rückgängig machen:

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top