面向对象的PHP - __set()无法访问受保护的属性

时间:2013-01-22 11:59:10

标签: php visibility

  

可能重复:
  PHP __get and __set magic methods

刚开始使用OOP。 。无论如何不确定我是否理解正确,但由于函数$attribute,代码不应该更改__set()的值?

<?php
class aclass
{
    protected $attribute; //edited from public to protected
    public function __get ($name)
    {
        return $this->$name;    
    }
    public function __set ($name, $value)
    {
        if($name == "foo")
        {
            $this->$name = $value;
        }
    }
} 
$a = new aclass();
$a->attribute = "bar";
echo $a->attribute;
?>

当我运行此错误消息时显示:

“致命错误:无法访问第16行的受保护属性aclass :: $ attribute ...” 第16行是“echo $ a-&gt;属性” - 其他帖子说该属性必须设置为PROTECTED但它不起作用。我使用PHP 5.4.3 - 任何想法?

2 个答案:

答案 0 :(得分:5)

只有在尝试访问非公开或未定义的属性时才会调用__set()魔术方法,但attribute属性 IS 已定义且 IS public,所以可以直接访问。

如果您希望__set()方法“拦截”对attribute的访问权限,则必须将其设为protectedprivate

答案 1 :(得分:1)

__set() 尝试将值分配给未定义的属性时将调用。在您的情况下,$属性已经使用类定义,因此不会调用__set