为什么PHP允许通过子类中的覆盖使受保护的和私有的方法公开?

Mat*_*son 12 php oop inheritance encapsulation visibility

从一些简短的提示,我发现当我执行以下操作时覆盖子类中的超类方法时出现错误:

  • 使用私有子类方法覆盖受保护的超类方法
  • 使用protected或private子类方法重写公共超类方法

但是,如果我在另一个方向执行此操作,则不会抛出任何错误:

  • 使用受保护或公共子类方法覆盖私有超类方法
  • 使用公共子类方法覆盖受保护的超类方法

这对我来说似乎很直观 - 我希望它能以相反的方式工作,以强制执行信息隐藏和封装.这似乎允许糟糕的设计,允许内部以可能破坏其他方法的方式暴露,我不能看到这是一个好主意的情况.为什么以这种方式实施,我错过了什么?

此外,这是其他编程语言的标准做法吗?

Kin*_*nch 16

你所谓的"强制信息隐藏"是可能会破坏子类的东西,因为突然的属性和方法可能会消失.你不能通过这种方式放松限制来破坏事物.

With private有点不同:在这种情况下,从子类的角度来看,属性/方法不存在.因此没有理由,为什么子类可能不会引入具有该名称的属性,因为它将是一个不同的属性.

你是对的,这可能会导致糟糕的设计,但你总是可以构建一个设计不佳的应用程序.


fiv*_*git 10

您不能降低类成员的可见性,只能增加它们.

想象一下,一个A类有一个公共方法,一个子类B会把它变成私有的.B可以被视为类型A,假设它具有该公共方法.