我有一个php单例会话类,如下所示。
class Session {
static private $_instance = NULL;
private function __construct()
{
session_start();
}
/**
* Prevents the class from being cloned
* @return NULL
*/
private function __clone() { }
/**
* Returns the singleton instance of this class
* @return Session
*/
public static function getInstance()
{
if (!self::$_instance) {
self::$_instance = new Session();
}
return self::$_instance;
}
public function __get($key) {
if (isset($_SESSION[$key])) {
return $_SESSION[$key];
}
return NULL;
}
public function __set($key, $value)
{
$_SESSION[$key] = $value;
}
public function __isset($key) {
return isset($_SESSION[$key]);
}
public function __unset($key) {
unset($_SESSION[$key]);
}
}
我可以按如下方式创建一个对象
$session = Session::getInstance();
$session->name = 'some name';
我也可以获得像
这样的值echo $session->name;
问题是,我想将一个数组传递给这个对象而它无法正常工作。例如,我想设置类似
的东西$_SESSION['user']['data'] = array('name'=>'some name',"empId"=>'123');
我是这样想的。
$session->['user']['data'] = array('name'=>'some name',"empId"=>'123');
但它不起作用。你能告诉我什么是错的吗?
答案 0 :(得分:3)
这种情况下的解决方法是使用:
public function &__get($key) {
if (isset($_SESSION[$key])) {
return & $_SESSION[$key];
}
return NULL;
}
您需要修改__get()
方法,因为像
$session->user['data'] = ...
将实际检索[user]
密钥,然后尝试为该临时数组结果分配一个新的子数组[data]
。
另请注意,$session->['user']['data']
语法无效。您需要$session->user['data']
或$session->{'user'}['data']
。
无论如何,如果你经常想做这样的作业,我认为使用包装器可能不是一个好主意。 (我确实有一些非常相似的东西。)
答案 1 :(得分:0)
$session->user = array('data' => array('name'=>'some name',"empId"=>'123'));
确保不要覆盖{1}}中要保留的其他内容