为什么函数在cakephp 3.X控制器和表是公共的,但函数在实体中受保护


Why are functions in cakephp 3.x controllers and tables public but functions in entities protected?

我使用的是cakephp 3.x

我做了这个观察。控制器和表中的函数声明为public。实体中的函数被声明为protected。为什么实体函数不能被声明为公共的?

这听起来像是您不知道何时以及为什么使用可见性作用域。参见这个问题"公共、私有和受保护的区别是什么?"

事实上,没有什么可以阻止你在实体中声明一个公共方法,试试吧。没有什么可以阻止您在其他类中使用protected和private。但是在架构明智的地方使用它们。而且实体已经有了公共方法。我建议你阅读书中关于实体的章节,它详细解释了实体是如何工作的,它们是什么,它们被认为是什么,以及你可以用它们做什么。

实体代表数据,通过属性或像数组一样访问数据,因为对象实现了ArrayAccess。为了访问虚拟属性(同样,请阅读本章),使用了实际上是受保护的访问器和mutator。当您尝试访问不存在的属性时,将调用这些方法,请参阅get()方法。它们受到保护是因为不希望直接访问它们,否则会破坏实体的工作方式。数据被认为只能通过属性或get()方法来访问,因此所有实体在任何地方都是一样的。

在编写良好的代码中,可见性范围通常是有原因的。但是我见过一些糟糕的代码,人们毫无理由地将对象私人化,这有效地阻止了您通过继承它们来改变对象的行为。我还没有检查过,但我很确定你不会在框架中找到私有方法,因为它被认为是扩展的。

底线:分析代码并理解为什么某些东西是受保护的,如果你想知道的话。