任何人都可以向我解释为什么以下代码没有按预期设置数组上的值?即使在分配了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
答案 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;
}