简体   繁体   English

我将如何传递数组作为__set magic方法的键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM