可以覆盖超级全局$ _SESSION吗?

| 用专门的会话对象覆盖超全局变量“ 0”是否安全?
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\');
    
已邀请:
        尽管这可能行得通,但我认为这不是明智的行为。在我看来,最不惊奇的原则适用于编程以及用户界面设计。如果您在脚本中覆盖了默认行为
$_SESSION
,这将使将来不得不处理您的代码的某些程序员感到困惑。 我认为以这种方式滥用ѭ0super的超全局性是一种骇人听闻的行为,也是一种令人不愉快的行为。 在我看来,更好的方法是编写一个带有静态方法的类来获取和设置数据:
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\')
访问它。 由于类本质上是全局的,因此您可以从代码中的任何位置访问它。这就不足为奇了,并且可以减少沿线的混乱。 如果出于某些设计原因确实想使用对象方法,则最好实现Singleton模式。     
        对我来说似乎有点冒险。您是否签出了session_set_save_handler方法?它使您可以指定要使用的处理程序,而不必尝试覆盖$ _SESSION。     
        如果您自己处理会话处理和存储,那么您可以做任何您想做的事情。在这方面,$ _ SESSION超全局变量可以像任何其他变量一样使用。 这是唯一的PHP特殊处理的默认会话处理程序。它期望在那里有一个普通的数组(并且也不能被数字索引)。如果您想再次使用它,则需要通过shutdown调用来撤销花哨的ArrayObject包装:
register_shutdown_function(function(){
    $_SESSION = (array)$_SESSION;
});
    

要回复问题请先登录注册