Установка значений массива в $ _SESSION через метод доступа - PullRequest
3 голосов
/ 13 сентября 2011

Может ли кто-нибудь объяснить мне, почему следующий код не устанавливает значения в массиве, как ожидалось? $ _SESSION ['foo'] остается пустым, даже после назначения time () и rand (). Я проверил, метод доступа __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 Ответ

1 голос
/ 13 сентября 2011

Я не уверен, что это можно заставить работать вообще.

Например, чтобы вернуться по ссылке , вы должны добавить оператора & также на сайте вызова. Я не уверен, как это могло бы быть возможно, не испортив красивый синтаксис, которого вы пытаетесь достичь.

Кроме того, вы не можете возвращать выражения по ссылке (только переменные). Так что это не сработает:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...