我将如何将数组作为__set魔术方法的关键传递

时间:2012-01-05 09:32:02

标签: php

我有一个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');

但它不起作用。你能告诉我什么是错的吗?

2 个答案:

答案 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}}中要保留的其他内容