[英]How will i pass an array as key to __set magic method
I have a php singleton session class as follows. 我有一个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]);
}
}
I can create an object as follows 我可以如下创建一个对象
$session = Session::getInstance();
$session->name = 'some name';
I can also get the value like 我也可以得到像
echo $session->name;
The problem is, i want to pass an array to this object and it is not working. 问题是,我想将数组传递给此对象,但它不起作用。 for example, i wan to set something like 例如,我想设置类似
$_SESSION['user']['data'] = array('name'=>'some name',"empId"=>'123');
I am trying like this. 我正在尝试这样。
$session->['user']['data'] = array('name'=>'some name',"empId"=>'123');
but it is not working. 但它不起作用。 Could you please suggest what is wrong. 你能建议出什么问题了吗?
The workaround in this case would be to use: 在这种情况下,解决方法是使用:
public function &__get($key) {
if (isset($_SESSION[$key])) {
return & $_SESSION[$key];
}
return NULL;
}
You need to modify the __get()
method, because an assignment like 您需要修改__get()
方法,因为类似
$session->user['data'] = ...
will actually retrieve the [user]
key, and then try to assign a new subarray [data]
to that temporary array result. 实际上会检索[user]
键,然后尝试为该临时数组结果分配一个新的子数组[data]
。
Also note that $session->['user']['data']
is invalid syntax. 还要注意, $session->['user']['data']
是无效的语法。 You either need $session->user['data']
or $session->{'user'}['data']
. 您需要$session->user['data']
或$session->user['data']
$session->{'user'}['data']
。
Anyway, I think it is probably not a good idea to use a wrapper if you often want to do assignments like that. 无论如何,我认为如果您经常想要进行此类分配,那么使用包装器可能不是一个好主意。 (I do actually have something very similar.) (我确实有非常相似的东西。)
$session->user = array('data' => array('name'=>'some name',"empId"=>'123'));
确保您不会覆盖要保留的user
任何其他内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.