安全地覆盖超级全球$ _SESSION?
是否安全覆盖超全球$_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');
虽然这工作,我不认为这是明智的行为。在我看来,最小惊喜原则适用于编程和用户界面设计。如果你在你的脚本覆盖的$_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模式。
这几乎是我现在所拥有的,但它并不会让它很容易与数组交互:'$ _SESSION ['something'] ['in'] ['array'] = 27'并使用$ a = Session :: get('something'); $ a ['in'] ['array'] = 26; Session :: set('something',$ a);'产生大量的数组副本 – 2011-06-13 17:15:33
然后实现[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
对我来说似乎有点冒险。你有没有检查出session_set_save_handler方法?它可以让你指定自己的处理程序来使用,而不是试图覆盖$ _SESSION。
我不使用PHP本身的会议可言,我使用的是自定义实现。 – 2011-06-13 17:09:42
@Lea:使用set_save_handler的东西,可以并处在PHP的默认会话处理自己的会话语义。您可以获得超全球_SESSION的好处,但可以提供填充/保存会话的所有逻辑。当你使用正常的会话_ *()函数时,PHP会在适当的时候调用你提供的处理程序。 – 2011-06-13 17:44:59
如果你处理的会话处理和储存自己,那么你可以做任何你请。在这方面,$ _SESSION超全局可以像任何其他变量一样使用。
这是它把它专门仅PHP的默认会话处理程序。它期望有一个正常的数组(并且不能用数字索引)。如果您想再次使用,您将需要一个关闭调用撤消看中ArrayObject的包装:
register_shutdown_function(function(){
$_SESSION = (array)$_SESSION;
});
我认为这将被摧毁以后更好的使用$ _SESSION [“OBJ”],处理适当的系列化 – venimus 2011-06-13 17:03:27
待办事项你自己处理会话存储还是你想依赖于phps默认的$ _SESSION行为? – mario 2011-06-13 17:04:47
@venimus它不会出现,只要我可以告诉... – lonesomeday 2011-06-13 17:05:16