通过访问器方法在$ _SESSION中设置数组值

时间:2011-09-13 07:16:05

标签: php arrays session php-5.3

任何人都可以向我解释为什么以下代码没有按预期设置数组上的值?即使在分配了time()和rand()之后,$ _SESSION ['foo']也保持为空。我已经检查过,在分配变量时实际上调用了__get访问器方法,但是由于某种原因它们没有被存储。

$test = Session::getSession('test');
$test->foo = array();
$test->foo[] = time();
$test->foo['baz'] = rand(1,9);
var_dump($_SESSION);

使用这个简单的Session包装器     

class Session 
{

    protected $namespace = null;

    public static function getSession($namespace) 
    {
        return new Session($namespace);
    }

    public static function destroySession($namespace) 
    {
        if(isset($_SESSION[$namespace])) {
            unset($_SESSION[$namespace]);
            return true;
        }

        return false;
    }

    private function __construct($namespace) 
    {
        $this->namespace = $namespace;

        if(!isset($_SESSION[$namespace])) {
            $_SESSION[$namespace] = null;
        }
    }

    public function &__get($name)
    {
        return (isset($_SESSION[$this->namespace][$name])) ? $_SESSION[$this->namespace][$name] : null;
    }

    public function __set($name, $value)
    {
        $_SESSION[$this->namespace][$name] = $value;
    }

}

如果它可能有用,我正在使用php 5.3.6

1 个答案:

答案 0 :(得分:1)

我不确定这是否可以使用。

首先,要return by reference,您还应在呼叫网站添加&运营商。如果不搞砸你想要实现的漂亮语法,我不确定如何做到这一点。

此外,您不能通过引用(仅变量)返回表达式。所以这不起作用:

public function &__get($name)
{
    return (isset($_SESSION[$this->namespace][$name])) 
        ? $_SESSION[$this->namespace][$name] 
        : null;
}

至少它应该写成

public function &__get($name)
{
    $value = isset($_SESSION[$this->namespace][$name])
             ? $_SESSION[$this->namespace][$name]
             : null;
    return $value;
}