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


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

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

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

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

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

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

Author: Matt Gibson, 2012-02-21

4 answers

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

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

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

 15
Author: KingCrunch, 2014-09-14 08:56:32

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

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

 9
Author: fivedigit, 2012-02-21 12:40:02

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

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

 0
Author: GordonM, 2012-02-21 13:01:05

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

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

 0
Author: jotadeaa, 2014-03-10 18:54:06