4

スーパーグローバル$_SESSIONを特殊なセッションオブジェクトで上書きしても安全ですか?

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');
4

3 に答える 3

6

これはうまくいくかもしれませんが、私はそれが賢明な行動だとは思いません。私の意見では、驚き最小の原則は、ユーザーインターフェイスの設計だけでなくプログラミングにも当てはまります。スクリプトのデフォルトの動作を上書きする$_SESSIONと、コードを処理しなければならない将来のプログラマーの混乱を招きます。

このように超グローバルな性質を悪用するのはハックであり、不快なことだと思います$_SESSION

私の意見では、データを取得および設定するための静的メソッドを使用してクラスを作成することをお勧めします。

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
    }
}

Session::get('someKey')次に、またはSession::get('someKey', 'default')およびを使用してこれにアクセスできますSession::set('someKey', 'someValue')

クラスは本質的にグローバルであるため、コード内のどこからでもこれにアクセスできます。それほど驚くことではなく、今後の混乱も少なくなります。

設計上の理由でオブジェクトメソッドを使用したい場合は、シングルトンパターンを実装するのが最適な場合があります。

于 2011-06-13T17:12:46.730 に答える
1

私には少し危険なようです。session_set_save_handlerメソッドをチェックアウトしましたか?$ _SESSIONを上書きする代わりに、使用する独自のハンドラーを指定できます。

于 2011-06-13T17:08:41.363 に答える
1

セッションの処理とストレージを自分で処理する場合は、好きなことを行うことができます。$ _SESSIONスーパーグローバルは、その点で他の変数と同じように使用できます。

それを特別に扱うのは、PHPのデフォルトのセッションハンドラーだけです。そこには通常の配列が必要です(数値インデックスも付けないでください)。それをもう一度使用したい場合は、シャットダウン呼び出しで派手なArrayObjectラッピングを元に戻す必要があります。

register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
于 2011-06-13T17:14:46.157 に答える