Подтвердить что ты не робот

Почему PHP имеет абстрактные классы, если вы можете использовать интерфейс и черты?

Раньше сегодня я занимался исследованием PHP абстрактных классов, interfaces и traits.

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

Теперь, мой вопрос: если вы получаете эквивалент абстрактного класса, когда используете интерфейс и черту, почему существуют абстрактные классы?

Если я ошибаюсь, и интерфейс и черта не являются эквивалентом абстрактного класса, можете ли вы объяснить, почему это не так?

4b9b3361

Ответ 1

Я думаю, что есть какая-то философская разница в том, как и когда их использовать.

Ты сказал:

  • абстрактные классы: "любое использование меня будет использовать эти методы и атрибуты "
  • : "все, что использует меня , должно иметь эти методы и атрибуты"
  • черты: "все, что использует меня , будет иметь эти методы и атрибуты".

Если вы сосредоточены на своих собственных формулировках, это имеет смысл.

Абстрактные классы на самом деле определяют вещи, которые являются абстрактными, например, Транспортное средство является абстрактной вещью до тех пор, пока ее материализованный в форме автомобиль или велосипед. Ни один из интерфейсов не определяет его или черты.

Интерфейсы дополняют функциональность наследования класса, где класс наследуется от нескольких классов (только некоторые языки предоставляют множественное наследование, например, C/С++). Интерфейсы, поскольку имена предполагают сосредоточиться на INTERFACE, а не на реализации метода интерфейса в классе, который его реализует. Он делает классы PLUG и PLAYABLE, поэтому каждый должен следовать стандарту . Если вы прочтете о factory и шаблоне адаптера в ООП, вы поймете это.

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

Edit Interface + Trait!= Абстрактный класс, потому что при использовании наследования Trait selective, когда вы выбираете конкретный признак для использования и при использовании Abstract Class наследование является обязательным или диктуется родительским классом, у вас нет свободы!

Ответ 2

Это немного похоже на высказывание, если существуют float, почему существуют целые числа, они оба выполняют свои собственные конкретные задачи, но, что более важно, посмотрите на историю PHP, чтобы пролить свет на это:

PHP был первоначально построен без какой-либо поддержки для классов, и за эти годы все больше и больше было добавлено для расширения возможностей PHP, поскольку мы продвигаем его все дальше и дальше (и спорная игра догоняет другие языки на основе ООП)

PHP 5.0

2004 - Представлены абстрактные классы и интерфейсы

PHP 5.4

2012 - Представленные черты

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

Ответ 3

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

Вы не наследуете никаких свойств или методов, и вы не будете принуждать объект к любому дереву наследования.

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

это то, как PHP делает знаменитые Mixins. В основном Mixin - это просто класс, который может делиться общими чертами с несколькими другими классами. Черты позволяют принудительно применять это ограничение для методов классов независимо от того, как эти классы наследуют друг от друга или нет.

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