Почему PHP позволяет сделать защищенные и приватные методы общедоступными через переопределение в подклассах? - PullRequest
12 голосов
/ 21 февраля 2012

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

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

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 21 февраля 2012

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

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

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

9 голосов
/ 21 февраля 2012

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

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

0 голосов
/ 10 марта 2014

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

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

0 голосов
/ 21 февраля 2012

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

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

...