Я никогда не мог понять это. Если Ваш язык не делает проверки типа, какие преимущества интерфейсы предоставляют Вам?
Интерфейсы заставляют вашу программу потерпеть неудачу раньше и более предсказуемо, когда подкласс "забывает" реализовать какой-то абстрактный метод в своем родительском классе.
В традиционном ООП PHP вам приходилось полагаться на что-то вроде следующего, чтобы выдать ошибку во время выполнения:
class Base_interface {
function implement_me() { assert(false); }
}
class Child extends Base_interface {
}
С интерфейсом вы получаете немедленную обратную связь, когда один из подклассов вашего интерфейса не реализует такой метод, в момент объявления подкласса, а не позже во время его использования.
Взято из по этой ссылке (красиво резюмирует):
Я лично считаю, что интерфейс является изящным решением при создании уровня DataAccess, который должен поддерживать несколько СУБД. Каждая реализация СУБД должна реализовывать глобальный интерфейс DataAccess с такими функциями, как Query, FetchAssoc, FetchRow, NumRows, TransactionStart, TransactionCommit, TransactionRollback и т. Д. Поэтому, когда вы расширяете свои возможности доступа к данным, вы вынуждены использовать общую схему определенных функций, чтобы вы Приложение не сломается в какой-то момент, потому что вы подумали, что функция Query теперь должна называться execQuery.
Интерфейс помогает вам развиваться в более широком смысле:)
Подсказка типа в сигнатурах функции / метода позволяет вам иметь гораздо больший контроль над тем, как класс взаимодействует с ним. среда.
Если вы просто надеетесь, что пользователь вашего класса будет использовать только правильные объекты в качестве параметров метода, вы, вероятно, столкнетесь с проблемами. Чтобы предотвратить это, вам придется реализовать сложные проверки и фильтры, которые просто раздувают ваш код и, безусловно, снижают производительность вашего кода.
Подсказка по типу дает вам инструмент для обеспечения совместимости без каких-либо раздутых рукописных проверок. Это также позволяет вашим классам рассказывать миру, что они могут делать и в чем они могут вписаться.
Интерфейсы, особенно в сложных фреймворках, таких как Zend Framework, значительно упрощают вашу жизнь, потому что они говорят вам, чего ожидать от класса и потому что вы знаете, какие методы нужно реализовать, чтобы быть совместимым с чем-то.
Типы выполняют три разные функции:
Первые два не требуют никакой формы проверки типов вообще . Таким образом, даже если бы PHP не проверял интерфейсы, они все равно были бы полезны только по этим двум причинам.
Я, например, всегда думаю о своих интерфейсах, когда делаю Ruby, несмотря на то, что Ruby не имеет интерфейсов. И мне часто хочется иметь какой-нибудь способ записать эти проектные решения в исходный код.
С другой стороны, я видел много кода Java, в котором использовались интерфейсы, но очевидно, что автор никогда о них не думал. Фактически, в одном случае по отступам, пробелам и некоторым оставшимся комментариям в интерфейсе можно было увидеть, что автор фактически только что скопировал и вставил определение класса и удалил все тела методов.
Теперь к третьему пункту: PHP на самом деле выполняет интерфейсы проверки типов. Тот факт, что тип проверяет их во время выполнения, не означает, что он вообще не проверяет их тип .
И, по сути, он даже не проверяет их во время выполнения, он проверяет их во время загрузки , что происходит перед во время выполнения. И не является ли «проверка типов не во время выполнения, а до этого» в значительной степени само определение проверки статических типов?
Интерфейсы, часто используемые при модульном тестировании (дизайн, управляемый тестированием).
он также предлагает более стабильный код. интерфейсы также используются для поддержки итераторов (например, поддержка foreach для объектов) и компараторов.
На мой взгляд, в этом нет смысла, нет необходимости и нет смысла. Такие вещи, как интерфейсы, модификаторы видимости или подсказки типов, предназначены для обеспечения "правильности" программы (в некотором смысле) без ее реального выполнения. Поскольку это невозможно в таком динамическом языке, как php, эти конструкции, по сути, бесполезны. Единственная причина, по которой они были добавлены в php - это сделать его более похожим на java, тем самым сделав язык более привлекательным для "корпоративного" рынка.
Забыл добавить: некомментированное downvoting - отстой. ;//
Он может быть слабо типизирован, но для методов есть подсказка типа: function myFunc (MyInterface $ interface)
Кроме того, интерфейсы действительно помогают при тестировании и разделении кода.
Вы получите ошибку, если не добавили требуемые методы с точно такой же сигнатурой.