Когда использовать расширяет / аннотация и реализует / интерфейс в PHP - PullRequest
3 голосов
/ 14 февраля 2012

Итак, я начинаю задыхаться от концепции abstract и interface в PHP.
Но когда это действительно когда-нибудь полезно?

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

И почему я должен создавать абстрактный класс вместо того, чтобы просто создавать класс, который работает сам по себе, но полезен для других классов.
Аннотация Возможно, я смогу обернуться и увидеть хорошее применение , например, сделав общий класс.Подобно созданию абстрактного класса Database, а затем распространению его на класс баз данных Mysql и MsAccess.Предоставление обеих схожих функций для работы, позволяя беспроблемный опыт в обоих случаях.

Но разве кто-нибудь может дать мне лучший пример того, когда abstract и interface действительно действительно полезны?
Ипожалуйста, обратите внимание, я знаю, как это работает, или как писать код, но не знаю, как и когда его использовать.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 14 февраля 2012

Abstract означает "здесь шаблон для вашего класса и некоторый код, который может начать вас".Разработчик абстрактного класса может пометить некоторые методы как предоставляемые расширяющим классом (abstract) или как final, что означает, что класс не может их переопределить.

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

Таким образом, практическое правило будет следующим:

Если у вас есть код, который может илидолжны использоваться классами-потомками, вам нужен абстрактный класс.Если у вас есть только объявления методов и свойств, вы можете использовать интерфейс.

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

6 голосов
/ 14 февраля 2012

Интерфейс не является классом, а абстрактный класс уже является классом.

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

Программирование с использованием интерфейсов позволяет вам заменить один класс другим , в то время как сохраняет тот же интерфейс. Так что это делает ваш код менее связанным. Он больше не запрограммирован на конкретные классы, а «только» на более легкие интерфейсы. Тогда интерфейс полезен, если вы не хотите программировать против конкретных имен классов, но против типов. Затем вы можете заменить объект любым другим объектом, который реализует тот же интерфейс.

С другой стороны, абстрактный класс - даже называемый абстрактным - довольно конкретен. Тем не менее, он не является окончательным, поэтому он формирует шаблон класса, например, спецификацию, как класс, который выходит из него, должен быть написан для определенной функциональности. Поскольку это абстрактно, оно не может прийти в себя, не выходя из него. Абстрактные классы используются для создания базовых классов с кодом, который будет использоваться более одного раза для уменьшения дублирования кода и невозможности непосредственного создания экземпляров.

2 голосов
/ 08 октября 2015

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

abstract - это класс, который скрывает некоторые функции и только показывает необходимые функции. Расширить ключевое слово можно использовать для abstract class.В общем, методы extends могут использоваться для расширения возможностей абстрактного класса.

2 голосов
/ 14 февраля 2012

Интерфейс работает как контракт.Если класс реализует интерфейс, другой код, который использует этот класс, теперь знает, что он поддерживает определенные функции.

Лучший пример интерфейса в PHP - это интерфейс Iterator.

Преимущество интерфейсов заключается в том, чточто классы могут реализовать несколько.«Расширение» не позволяет этого.Это означает, что подкласс может реализовывать интерфейс, но его родитель не должен.

Читать шаблоны проектирования.Многое из этого вы найдете покрытым, и у вас больше никогда не будет сомнений, в каких случаях это имеет смысл.«Начните с разработки шаблонов» Я подумал, что это хорошая книга, очень хорошо написанная.Хотя они используют Java в своих примерах, большинство вещей очень применимо в PHP.

У меня есть еще один реальный сценарий.

Наше приложение всегда создает исключения вездевсякий раз, когда возникает ошибка.Каждый тип исключения получает свой собственный класс.Примером этого является исключение RecordNotFound.

Если исключения не обнаружены, существует блок исключений верхнего уровня, который выглядит примерно так:

try {

 // Do everything in the app!

} catch (Exception $e) {

  // draw a good error page

}

В некоторых случаях требуются исключениябыть сопоставленным с определенными кодами состояния HTTP, такими как 404 (не найден).Поэтому у нас есть этот интерфейс:

interface HTTPException {

  function getHTTPCode();

}

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

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

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