-3

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

刚刚从 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->attribute” - 其他帖子说该属性必须设置为 PROTECTED 但它不起作用。我正在使用 PHP 5.4.3 - 有什么想法吗?

4

2 回答 2

5

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

如果您希望该__set()方法“拦截”对 的访问attribute,则必须使用protectedprivate

于 2013-01-22T12:02:00.783 回答
1

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

于 2013-01-22T12:03:23.230 回答