2011-06-13 66 views
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'); 
+0

我认为这将被摧毁以后更好的使用$ _SESSION [“OBJ”],处理适当的系列化 – venimus 2011-06-13 17:03:27

+0

待办事项你自己处理会话存储还是你想依赖于phps默认的$ _SESSION行为? – mario 2011-06-13 17:04:47

+0

@venimus它不会出现,只要我可以告诉... – lonesomeday 2011-06-13 17:05:16

回答

5

虽然这工作,我不认为这是明智的行为。在我看来,最小惊喜原则适用于编程和用户界面设计。如果你在你的脚本覆盖的$_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')访问此。

由于阶级本质上是全球性的,你可以从任何地方在你的代码中访问此。这并不令人惊讶,并且会减少混乱。

如果你确实想使用对象方法的一些设计原因,它可能是最好的实现Singleton模式。

+0

这几乎是我现在所拥有的,但它并不会让它很容易与数组交互:'$ _SESSION ['something'] ['in'] ['array'] = 27'并使用$ a = Session :: get('something'); $ a ['in'] ['array'] = 26; Session :: set('something',$ a);'产生大量的数组副本 – 2011-06-13 17:15:33

+3

然后实现[Singleton](http://php.net/manual/en/language.oop5.patterns.php#language.oop5 .patterns.singleton)模式,这会导致类似'$ session = Session :: getInstance(); $ session ['something'] ['in'] ['array'] = 27;' – lonesomeday 2011-06-13 17:16:09

1

对我来说似乎有点冒险。你有没有检查出session_set_save_handler方法?它可以让你指定自己的处理程序来使用,而不是试图覆盖$ _SESSION。

+0

我不使用PHP本身的会议可言,我使用的是自定义实现。 – 2011-06-13 17:09:42

+1

@Lea:使用set_save_handler的东西,可以并处在PHP的默认会话处理自己的会话语义。您可以获得超全球_SESSION的好处,但可以提供填充/保存会话的所有逻辑。当你使用正常的会话_ *()函数时,PHP会在适当的时候调用你提供的处理程序。 – 2011-06-13 17:44:59

1

如果你处理的会话处理和储存自己,那么你可以做任何你请。在这方面,$ _SESSION超全局可以像任何其他变量一样使用。

这是它把它专门仅PHP的默认会话处理程序。它期望有一个正常的数组(并且不能用数字索引)。如果您想再次使用,您将需要一个关闭调用撤消看中ArrayObject的包装:

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