Php 通过访问器方法在$\u会话中设置数组值

Php 通过访问器方法在$\u会话中设置数组值,php,arrays,session,php-5.3,Php,Arrays,Session,Php 5.3,有人能解释一下为什么下面的代码没有按预期设置数组上的值吗$_会话['foo']保持为空,即使在分配了time()和rand()之后也是如此。我已经检查过了,在分配变量时实际上调用了uuu get accessor方法,但是由于某种原因它们没有被存储 $test = Session::getSession('test'); $test->foo = array(); $test->foo[] = time(); $test->foo['baz'] = rand(1,9); var

有人能解释一下为什么下面的代码没有按预期设置数组上的值吗$_会话['foo']保持为空,即使在分配了time()和rand()之后也是如此。我已经检查过了,在分配变量时实际上调用了uuu get accessor方法,但是由于某种原因它们没有被存储

$test = Session::getSession('test');
$test->foo = array();
$test->foo[] = time();
$test->foo['baz'] = rand(1,9);
var_dump($_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;
    }

}

如果它可能是相关的,我使用的是PHP5.3.6,我不确定这是否可以实现

首先,您还应该在呼叫站点添加
&
接线员。我不知道如果不把你想要达到的语法搞砸怎么可能做到这一点

此外,不能通过引用返回表达式(仅限变量)。所以这是行不通的:

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;
}

这也一直困扰着我,所以+1。但是如果你制作一个数组,分配时间和rand(),然后将其设置为$test->foo,它就可以工作了…@NoBBy:是的,这是我尝试过的,但不幸的是它不是万无一失的,所以我宁愿不在我们的应用程序中使用它:)你永远不知道。我收到了以下通知:“间接修改重载的属性会话:$foo没有效果”“引用只应返回变量引用显然,php内部的工作方式是,_get magic方法总是以只读方式返回值,而不管引用指示符怎么说。因此,据我所知,除非我们将库扩展到无法识别的程度,否则无法实现我们在这里想要的,我们不妨使用Zend_会话。(来源:)。