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')orSession::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 回答