1

我为我的会话变量使用了一个神奇的 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 手册,但功能看起来和我的一样。

我是不是做错了什么,或者这些功能真的没有什么神奇之处。

4

4 回答 4

1

我认为 getter 和 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;

?

于 2010-04-05T19:35:23.947 回答
1

第一个问题,当你打电话时

unset($session->var_name);

应该和调用一样

$session->_unset('var_name');

关于无法使用 __get(); 什么不起作用?变量被设置为什么以及给出什么警告。确保您已设置error_reporting()为 E_ALL。

检查您是否已致电可能也是一个好主意session_start

于 2010-04-05T19:36:18.260 回答
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
)

好吧,也许不是“神奇的”。但按预期工作。
如果这不是您想要的,请详细说明...

于 2010-04-05T19:40:38.330 回答
0

这是我到目前为止对魔术功能的理解

如果我错了,请纠正我...

$SESSION 是一个数组而不是一个对象,因此您可以使用 $session['field'] 而不是 $session->field 来访问它们

魔术函数允许您在任何函数之前使用函数名称 __fnName作为

fnNameNewField($value);

因此,它将作为键分离到 NewField 中,并将发送到 __fnName 并在此完成操作

例如: setNewId($value) 将通过 key= new_id 和参数发送到 __set()...

于 2014-01-28T11:08:19.670 回答