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

时间:2012-02-21 12:35:51

标签: php oop inheritance visibility encapsulation

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:9)

您不能降低班级成员的知名度,只能增加他们。

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

答案 2 :(得分:0)

如果一个超类公开公开一个方法,那么它的所有子类也必须公开相同的方法(或一个被覆盖的版本),因此减少方法的可访问性是一个子类在PHP中是非法的(几乎每个类都是基于类的) OO语言)。

相反的情况并非如此,因此增加子类中方法的可访问性是完全正确的。

答案 3 :(得分:0)

如果您认为在子类中公开private / protected方法表示存在问题,只需将方法设为final。

以这种方式看待:通过 NOT 使方法成为最终,您允许任何子类随意覆盖它;这显然包括提高其知名度。