В чем смысл интерфейсов на слабо типизированном языке, например PHP?

Я никогда не мог понять это. Если ваш язык не проверяет тип, какие преимущества предоставляют вам интерфейсы?

Интерфейсы заставляют вашу программу терпеть неудачу раньше и более предсказуемо, когда подкласс «забывает» реализовать какой-либо абстрактный метод в своем родительском классе.

В традиционном ООП для PHP вы должны опираться на что-то вроде следующего, чтобы выпустить ошибку во время выполнения:

class Base_interface { function implement_me() { assert(false); } } class Child extends Base_interface { } 

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

Взято из этой ссылки (суммирует это красиво):

  • Интерфейсы позволяют вам определять / создавать общую структуру для ваших классов – устанавливать стандарт для объектов.
  • Интерфейсы решают проблему одиночного наследования – они позволяют вам вводить «качества» из нескольких источников.
  • Интерфейсы обеспечивают гибкую базовую / корневую структуру, которую вы не получаете с классами.
  • Интерфейсы великолепны, когда у вас несколько кодеров, работающих над проектом; вы можете создать свободную структуру для программистов, чтобы следить за ними и позволить им беспокоиться о деталях.

Я лично нахожу взаимодействие с аккуратным решением при построении уровня DataAccess, который должен поддерживать несколько СУБД. Каждая реализация СУБД должна реализовывать глобальный интерфейс DataAccess с такими функциями, как Query, FetchAssoc, FetchRow, NumRows, TransactionStart, TransactionCommit, TransactionRollback и т. Д. Поэтому, когда вы расширяете возможности доступа к данным, вы вынуждены использовать общую определенную функцию chhema, чтобы вы приложение не будет прерываться в какой-то момент, потому что вы решили, что функция Query теперь должна быть названа execQuery.

Интерфейс помогает вам развиваться в большей картине 🙂

Типы обслуживают три различные функции:

  • дизайн
  • документация
  • проверка фактического типа

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

Я, например, всегда думаю о своих интерфейсах, когда я занимаюсь Ruby, несмотря на то, что Ruby не имеет интерфейсов. И я часто хочу, чтобы у меня был способ записать эти проектные решения в исходном коде.

С другой стороны, я видел много Java-кода, который использовал интерфейсы, но, очевидно, автор никогда не думал о них. Фактически, в одном случае можно было видеть из отступов, пробелов и некоторых оставшихся комментариев в интерфейсе, которые автор фактически только что скопировал и вставил определение класса и удалил все тела методов.

Теперь к третьему вопросу: PHP на самом деле выполняет проверки типов. Просто потому, что этот тип проверяет их во время выполнения, не означает, что он не вводит их вообще .

И, фактически, он даже не проверяет их во время выполнения, он проверяет их во время загрузки , что происходит до выполнения. И разве «проверка типов не происходит во время выполнения, но до этого», в значительной степени это определение проверки статического типа?

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

Интерфейсы часто используются с модульным тестированием (тестовый дизайн).

он также предлагает вам более стабильный код. интерфейсы также используются для поддержки итераторов (например, поддержка foreach на объектах) и компараторов.

Он может быть слабо типизирован, но есть тип намека на методы: function myFunc(MyInterface $interface) Кроме того, интерфейсы помогают в тестировании и развязывании кода.

Тип подсказки в сигнатурах функции / метода позволяет вам иметь гораздо больше контроля над тем, как класс взаимодействует с его средой.

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

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

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

На мой взгляд, нет смысла, нет необходимости и смысла. Такие вещи, как интерфейсы, модификаторы видимости или подсказки типов, предназначены для обеспечения «правильности» программы (в некотором смысле) без ее фактического запуска. Поскольку это невозможно в динамическом языке, таком как php, эти конструкции практически бесполезны. Единственная причина, по которой они были добавлены в php, – это больше похоже на java, что делает язык более привлекательным для «корпоративного» рынка.

Забыл добавить: uncommented downvoting отстой. //