普通魔术师和魔术师和吸气者之间的区别

时间:2010-04-05 19:31:35

标签: php getter-setter magic-function

我正在为我的会话变量使用魔术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 个答案:

答案 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()