2

我不明白为什么__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()函数时,都会__unset()自动调用 Magic Method 并取消设置变量。

在上面的代码中,我使用的是 unset 但它没有调用__unset(). 为什么?我在理解魔法方法时遗漏了什么__unset()吗?

4

2 回答 2

5

魔术方法__set,__get和仅在访问不可访问__isset的属性__unset时才被调用。这意味着私有属性、受保护属性(在子类之外访问)或尚未创建的属性。

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

注意

您应该只protected在需要从扩展类访问属性或函数时使用它们——不要仅仅因为它而使用它。

于 2013-05-21T13:30:45.627 回答
4

当 unset() 用于不可访问的属性时,会调用 __unset()。(来源)

因此它只能对不可访问的(即privateprotected)道具有效。

于 2013-05-21T13:33:18.350 回答