Я никогда не мог понять это. Если ваш язык не проверяет тип, какие преимущества предоставляют вам интерфейсы?
Интерфейсы заставляют вашу программу терпеть неудачу раньше и более предсказуемо, когда подкласс «забывает» реализовать какой-либо абстрактный метод в своем родительском классе.
В традиционном ООП для 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 отстой. //