Skip to content

Latest commit

 

History

History
executable file
·
50 lines (33 loc) · 4.38 KB

interfaces.md

File metadata and controls

executable file
·
50 lines (33 loc) · 4.38 KB

Интерфейсы в ООП

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

Если класс реализует интерфейс, в нем обязаны быть эти методы (иначе PHP укажет на ошибку). Обычно интерфейс представляет собой какое-то умение: классы, реализующие этот интерфейс, умеют что-то делать. Класс может реализовывать несколько интерфейсов.

Допустим, мы делаем сайт, где можно ставить лайки постам и комментам. Допустим, у нас есть классы User, Post и Comment.

Вот у нас есть пост и коммент, мы можем увеличить число лайков, допустим методом increaseLikeCount() и узнавать сколько у них лайков методом getLikeCount(), то есть у них есть что-то общее, но как описать это в коде? Как сказать, что эти 2 класса, в отличие от других, умеют работать с лайками?

Второй пример, мы хотим сделать функцию, которая допустим ставит лайк от определенного пользователя определенному посту или комментарию:

function addLike(User $user, $object) { ... }

Мы сказали что $user должен быть объектом класса User, а как сказать что в качестве $object можно передать любой класс, который может принимать лайки?

Обе проблемы решают интерфейсы. Объявим интерфейс Likeable ("лайкабельный"), который представляет собой умение получать лайки. Опишем, какие методы обязаны реализовать такие классы. Напишем комментарий к нему (советую всегда начинать написание классов и интерфейсов с комментария):

/**
 * Интерфейс представляет способность получать лайки.
 */
interface Likeable
{
public function increaseLikeCount();
public function getLikeCount();
}

Теперь укажем в коде, что посты и комменты можно лайкать:

class Post implements Likeable { ... }
class Comment implements Likeable { ... }

на этом этапе php проверит, не забыли ли мы реализовать в классах упомянутые методы. Если забыли — выдаст ошибку. Как удобно!

Ну и теперь мы можем использовать интерфейс чтобы указать какие аргументы принимает функция addLike:

function addLike(User $user, Likeable $object) { ... }

Благодаря интерфейсам наш код стал расширяем. В будущем мы сможем добавить, например, класс Photo, который тоже можно лайкать. Если он будет реализовывать интерфейс Likeable то функция вроде addLike() сможет работать и с ним без переписывания кода.

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