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


Object-Oriented PHP - __set() cannot access protected attribute

可能的重复项:
PHP __get和__set魔术方法

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

<?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;
?>

当我运行它时,会显示一条错误消息:

"致命错误:无法访问受保护的属性 aclass::$attribute . . .在第 16 行"第 16 行是"echo $a->属性" - 其他帖子说该属性必须设置为 PROTECTED 但它不起作用。我使用的是 PHP 5.4.3 - 有什么想法吗?

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

如果希望__set()方法"intecept"访问attribute,则必须将其设为protectedprivate

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