我无法理解为什么__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()
时遗漏了什么吗?
答案 0 :(得分:5)
只有在访问无法访问的属性时才会调用魔术方法__set
,__get
,__isset
和__unset
。这意味着私有属性,受保护属性(在子类之外访问)或尚未创建的属性。
调用内部变量$_name
代替$name
,或将$name
设置为private
或protected
代替public
将解决您的问题
注意强>:
只有在需要从扩展类访问时才应使用protected
属性或函数 - 不要仅仅因为它而使用它。
答案 1 :(得分:4)
在无法访问的属性上使用unset()时,将调用__ unset()。 (source)
因此它只能在无法访问(即private
和protected
)道具时生效。