Почему PHP позволяет публиковать защищенные и частные методы с помощью переопределения в подклассах?
Из некоторых кратких размышлений я обнаружил, что получаю ошибку при переопределении методов суперкласса в подклассе, когда я делаю следующее:
- Переопределите защищенный метод суперкласса частным методом подкласса
- Переопределить открытый метод суперкласса с помощью защищенного или закрытого метода подкласса
Однако, если я сделаю это в другом направлении, ошибка не возникнет:
- Переопределение частного метода суперкласса защищенным или общедоступным подклассом метод
- Переопределение защищенного метода суперкласса общедоступным методом подкласса
Мне это кажется противоречащим интуиции - я ожидал, что это будет работать наоборот, чтобы обеспечить сокрытие и инкапсуляцию информации. Это, по-видимому, допускает плохой дизайн, позволяя раскрывать внутренние компоненты таким образом, чтобы это могло нарушить другие методы, и я не вижу случая, когда это было бы хорошей идеей. Почему это было реализовано таким образом и что я пропустил?
Кроме того, это стандартная практика в других языках программирования?
4 answers
То, что вы называете "принудительным сокрытием информации", - это то, что может нарушить подклассы, потому что внезапно свойства и методы могут исчезнуть. Вы не можете нарушать правила, снимая ограничения таким образом.
С private
немного отличается: в этом случае свойство/метод не существует с точки зрения дочернего класса. Таким образом, нет причин, по которым подкласс не может вводить свойство с таким именем, потому что это будет другое свойство.
Ты правильно, что это может привести к плохому дизайну, но вы всегда можете создать приложение с плохим дизайном.
Вы не можете уменьшить видимость членов класса, только увеличить их.
Представьте себе класс A, у которого есть открытый метод, а подкласс B сделает его закрытым. B можно рассматривать как тип A, для которого предполагается, что у него есть этот общедоступный метод.
Если суперкласс предоставляет метод публично, то все его подклассы также должны предоставлять один и тот же метод (или переопределенную версию), поэтому уменьшение доступности метода является подклассом незаконным в PHP (и почти во всех языках OO на основе классов).
Обратное неверно, поэтому увеличение доступности методов в подклассах совершенно нормально.
Если вы считаете, что раскрытие частного/защищенного метода в подклассе представляет проблему, просто сделайте метод окончательным.
Смотрите на это так: по НЕТ делая метод окончательным, вы разрешаете любому подклассу переопределять его по желанию; это, очевидно, включает в себя увеличение его видимости.