Почему PHP позволяет публиковать защищенные и частные методы с помощью переопределения в подклассах?

Из нескольких кратких вопросов о том, что я обнаружил ошибку при переопределении методов суперкласса в подклассе, когда я делаю следующее:

  • Переопределить защищенный метод суперкласса с помощью метода частного подкласса
  • Переопределить общедоступный метод суперкласса с помощью метода защищенного или частного подкласса.

Однако, если я делаю это в другом направлении, ошибка не возникает:

  • Переопределение частного метода суперкласса с защищенным или общедоступным подклассом
  • Переопределение защищенного метода суперкласса с помощью метода общедоступного подкласса

Это кажется мне интуитивным противником - я ожидал, что он будет работать наоборот, чтобы обеспечить скрытие и инкапсуляцию информации. Это, по-видимому, позволяет создать плохой дизайн, позволяя внутренним структурам подвергаться воздействию, способным нарушить другие методы, и я не вижу случая, когда это будет хорошей идеей. Почему это было реализовано таким образом и что я пропустил?

Кроме того, эта стандартная практика на других языках программирования?

Ответ 1

То, что вы называете "принудительное скрытие информации", - это нечто, что может сломать подклассы, потому что внезапно свойства и методы могут исчезнуть. Вы не можете сломать вещи, потеряв ограничения таким образом.

С private немного отличается: в этом случае свойство /method не существует с точки зрения дочернего класса. Таким образом, нет причин, почему подкласс может не вводить свойство с этим именем, потому что это будет другое свойство.

Вы правы, что это может привести к плохому дизайну, но вы всегда можете создать приложение с плохим дизайном.

Ответ 2

Вы не можете уменьшить видимость членов класса, только увеличивайте их.

Представьте себе класс A, который имеет открытый метод, а подкласс B сделает его закрытым. B можно рассматривать как тип A, для которого предполагается, что он имеет общедоступный метод.

Ответ 3

Если суперкласс предоставляет публичный метод, то все его подклассы также должны выставлять один и тот же метод (или переопределенную версию), поэтому уменьшение доступности метода является подклассом в PHP (и почти каждый класс Язык OO).

Противоположность неверна, поэтому повышение доступности методов в подклассах отлично.

Ответ 4

Если вы считаете, что использование частного/защищенного метода в подклассе представляет проблему, просто сделайте окончательный метод.

Смотрите так: НЕ, чтобы сделать окончательный метод, вы позволяете любому подклассу переопределять его по желанию; это, очевидно, включает увеличение его видимости.