【问题标题】:Difference between normal and magic setters and getters普通 setter 和 getter 之间的区别
【发布时间】:2010-04-05 19:31:35
【问题描述】:

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

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

【问题讨论】:

    标签: php getter-setter magic-function


    【解决方案1】:

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

    unset($session->var_name);
    

    应该和调用一样

    $session->_unset('var_name');
    

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

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

    【讨论】:

    • 哦,是的,set 和 get 现在正在工作。我为我的测试引用了错误的变量。 +1感谢您对 unset 方法的正确语法。请问这个语法:unset($session->var_name);如果没有魔法未设置就不行?
    • @Saif 不,它没有。如果要使用unset,则必须定义__unset 函数。
    • 如果没有 __unset() 方法,至少它不会对 _SESSION 产生影响。
    • 好吧,我现在都清楚了。我也会用它自己进行一些测试。至少我现在知道我在正确的轨道上!
    【解决方案2】:

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

    ?

    【讨论】:

    • 这是一个问题而不是一个答案。其次,魔术功能就是这样。职能。它们可以访问的限制与普通函数相同,因此它们没有理由不能从外部源返回值。例如 Doctrine 从数据库中获取和设置值。
    • 不,您不必再在函数内部定义变量。那是我确实理解的“魔法”的一部分。当你调用 $someclass->variable = 10;如果它不存在,它将生成该变量。
    【解决方案3】:
    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
    )
    

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

    【讨论】:

    • 是的,这就是我想要的。我在代码中犯了一些愚蠢的错误,对此感到抱歉。这很好用,只是我不清楚 unset 的正确语法。然而,它是这样工作的。
    【解决方案4】:

    这是我迄今为止对魔法函数的理解

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

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

    访问它们

    魔法函数允许你在任何函数之前使用函数名__fnName作为

    fnNameNewField($value);

    所以,它将被分离到NewField作为key,并将被发送到__fnName并在此完成操作

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

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2011-09-07
      • 1970-01-01
      • 2021-05-12
      • 2019-02-10
      • 2015-01-06
      • 2015-07-26
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多