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

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

5
задан Deane 3 May 2010 в 13:15
поделиться

9 ответов

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

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

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

class Child extends Base_interface {
}

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

10
ответ дан 18 December 2019 в 14:43
поделиться

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

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

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

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

2
ответ дан 18 December 2019 в 14:43
поделиться

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

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

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

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

0
ответ дан 18 December 2019 в 14:43
поделиться

Типы выполняют три разные функции:

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

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

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

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

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

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

1
ответ дан 18 December 2019 в 14:43
поделиться

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

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

0
ответ дан 18 December 2019 в 14:43
поделиться

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

Забыл добавить: некомментированное downvoting - отстой. ;//

-4
ответ дан 18 December 2019 в 14:43
поделиться

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

0
ответ дан 18 December 2019 в 14:43
поделиться

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

0
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: