PHP Magic Method __unset()不能用于调用unset函数

时间:2013-05-21 13:29:05

标签: php magic-methods unset

我无法理解为什么__unset()不起作用。

class myclass {
    public $name = array();

    public function __set($arraykey, $value){
        $this->name[$arraykey] = $value;
    }

    public function __isset($argu){
        return isset($this->name[$argu]);
    }

    public function __unset($argu){ 
        echo "Working: Unset $this->name[$argu]";
        unset($this->name[$argu]);
    }
}

$obj = new myclass;
$obj->name = 'Arfan Haider';

var_dump(isset($obj->name));

unset($obj->name);

我读到,只要调用unset()函数,就会自动调用Magic Method __unset()并取消设置变量。

在上面的代码中我使用unset但它不会调用__unset()。为什么?我在理解魔术方法__unset()时遗漏了什么吗?

2 个答案:

答案 0 :(得分:5)

只有在访问无法访问的属性时才会调用魔术方法__set__get__isset__unset。这意味着私有属性,受保护属性(在子类之外访问)或尚未创建的属性。

调用内部变量$_name代替$name,或将$name设置为privateprotected代替public将解决您的问题

注意

只有在需要从扩展类访问时才应使用protected属性或函数 - 不要仅仅因为它而使用它。

答案 1 :(得分:4)

  在无法访问的属性上使用unset()时,将调用

__ unset()。 (source)

因此它只能在无法访问(即privateprotected)道具时生效。