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

面向对象的PHP-\uuuu set()无法访问受保护的属性,php,visibility,Php,Visibility,可能重复: 只是从OOP开始。无论如何,我不确定我是否正确理解了它,但是代码不应该因为函数集而更改$attribute的值吗 当我运行此命令时,一条错误消息显示: 致命错误:无法访问受保护的属性aclass::$attribute。第16行 第16行是echo$a->attribute-其他帖子说该属性必须设置为PROTECTED,但它不起作用。Im使用PHP 5.4.3-有什么想法吗?只有在尝试访问非公共或未定义的属性时,才会调用您的_set magic方法,但是属性属性已定义且是公共的,因

可能重复:

只是从OOP开始。无论如何,我不确定我是否正确理解了它,但是代码不应该因为函数集而更改$attribute的值吗

当我运行此命令时,一条错误消息显示:

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

只有在尝试访问非公共或未定义的属性时,才会调用您的_set magic方法,但是属性属性已定义且是公共的,因此可以直接访问它

如果希望uu set方法接受对属性的访问,则必须将其设置为受保护或私有。

\uu set
将在尝试为未定义的属性赋值时调用。在您的情况下,$属性已经用class定义,因此不会调用_集。

您应该检查其他类似的问题,这些问题以前已经问过很多次了,请在开始提问之前进行长时间搜索。如果您只是从OOP开始,我建议以后再使用_get和_集;在第一种情况下,它们是有用的,但不是必须学习的;掌握好主要概念,稍后再回到魔术方法。有些人不喜欢它们,坚持编写名为getPropname和setPropname的单独方法;这可能是一种更容易开始的方式。另外,即将发布的PHP版本5.5将提供更多的语法选项来定义属性,这意味着对神奇方法的需求将大大减少。很抱歉,我正在阅读的书中谈到了它,它不是很清楚,它使用了很多,所以我不得不理解它。当我阅读php手册时,我更加迷路了。我发布了一个关于它的问题,因为我在搜索时得到的结果对于我正在寻找的东西来说有点太深了@迪尔的链接是一个帮助,谢谢。也谢谢你的提示@SDC!这与OOP无关。这是关于基本的语言特性和可见性的,但事实并非如此。尝试访问私有或受保护的属性时将调用它,请参见@MatteoTassinari'sanwser@WouterJ这实际上是正确的,应该与另一个合并answer@Dale好吧,我有点太快了。这是正确的,但它没有回答问题。我已经删除了我的下一票。@WouterJ我想知道通过uu_集执行时,新创建的属性的访问级别是什么?嗯…,经过一个快速测试,它看起来是公共的,这很有趣,因为这样它就不能再通过设置访问了,哈哈,PHP@Dale是的,我刚刚找到了同样的答案。这看起来不正确…它还为未定义的properties@Dale谢谢,答案更新了!将$attribute设置为protected或private无效。它发出一个错误:无法访问受保护的属性。有什么想法吗?我访问了上面关于同一主题但答案相同的建议链接,即不将属性设置为public,而是设置为protected或private。我遗漏了什么?我只是用受保护的$attribute替换了public$attribute进行了尝试,它对我来说是正确的。尝试后,没有出现错误,请参阅