我正在为我的会话变量使用魔术getter / setter类,但我发现普通的setter和getter之间没有任何区别。
代码:
class session
{
public function __set($name, $value)
{
$_SESSION[$name] = $value;
}
public function __unset($name)
{
unset($_SESSION[$name]);
}
public function __get($name)
{
if(isset($_SESSION[$name]))
{
return $_SESSION[$name];
}
}
}
现在我注意到的第一件事就是我必须调用$session->_unset('var_name')
来删除变量,没有什么'神奇的'。
其次,当我尝试使用$session->some_var
时,这不起作用。我只能使用$_SESSION['some_var']
获取会话变量。
我查看了PHP手册,但功能与我的相同。
我做错了什么,或者这些功能真的没有什么神奇之处。
答案 0 :(得分:1)
我认为getters和setter是针对类中的变量的吗?
class SomeClass {
private $someProperty;
function __get($name) {
if($name == 'someProperty') return $this->someProperty;
}
function __set($name, $value) {
if($name == 'someProperty') $this->someProperty = $value;
}
}
$someClass = new SomeClass();
$someClass->someProperty = 'value';
echo $someClass->someProperty;
答案 1 :(得分:1)
第一个问题,当你打电话
unset($session->var_name);
它应该与调用
相同$session->_unset('var_name');
关于无法使用__get();什么不起作用?变量设置为什么以及给出了什么警告。确保已将error_reporting()
设置为E_ALL。
检查您是否已拨打session_start
答案 2 :(得分:1)
class session { /* ...as posted in the question ... */ }
session_start();
$s = new session;
$s->foo = 123;
$s->bar = 456;
print_r($_SESSION);
unset($s->bar);
print_r($_SESSION);
打印
Array
(
[foo] => 123
[bar] => 456
)
Array
(
[foo] => 123
)
好吧,也许不是“神奇”。但按预期工作。
如果这不是你想要的,请详细说明......
答案 3 :(得分:0)
这是我对魔法功能的理解
如果我错了,请纠正我......
$ SESSION是一个数组而不是一个Object 因此,您可以使用$ session ['field']而不是$ session->字段
来访问它们magic函数允许您在任何函数之前使用函数名__fnName
fnNameNewField($值);
因此,它将被分为NewField作为键,并将被发送到__fnName,操作将在此处完成
例如: setNewId($ value)将使用key = new_id和Parameters ...
发送到__set()