Добавить в корзинуПозвонить
Найти в Дзене
WebTechnology

Интерфейсы в PHP

В этой статье мы продолжим заниматься возможностями по ООП, которые нам предоставляет PHP. И в этот раз разберём тему интерфейсов в PHP. Если кто-то изучал C++, то те знают, что там существует множественное наследование. То есть, когда один класс наследует сразу несколько других классов. На мой взгляд, это создаёт жуткую путаницу. Поэтому было принято решение: в PHP отказаться от множественного наследования. Однако, компенсировать это как-то было надо, и тогда придумали интерфейсы. Кстати, те, кто знает Java, поймут, о чём идёт речь, так как там тоже нет множественного наследования, но имеются интерфейсы. А о том, как использовать интерфейсы в PHP я расскажу в этой статье. Интерфейс - это набор методов без реализации. То есть в интерфейс входят методы с именем и входными параметрами. Больше ничего нет. Любой класс, который реализует (обратите внимание, что не наследует, а реализует) данный интерфейс, обязан реализовать каждый метод. Чтобы стало ещё понятнее, хочется привести аналог из

В этой статье мы продолжим заниматься возможностями по ООП, которые нам предоставляет PHP. И в этот раз разберём тему интерфейсов в PHP. Если кто-то изучал C++, то те знают, что там существует множественное наследование. То есть, когда один класс наследует сразу несколько других классов. На мой взгляд, это создаёт жуткую путаницу. Поэтому было принято решение: в PHP отказаться от множественного наследования. Однако, компенсировать это как-то было надо, и тогда придумали интерфейсы. Кстати, те, кто знает Java, поймут, о чём идёт речь, так как там тоже нет множественного наследования, но имеются интерфейсы. А о том, как использовать интерфейсы в PHP я расскажу в этой статье.

Интерфейс - это набор методов без реализации. То есть в интерфейс входят методы с именем и входными параметрами. Больше ничего нет. Любой класс, который реализует (обратите внимание, что не наследует, а реализует) данный интерфейс, обязан реализовать каждый метод. Чтобы стало ещё понятнее, хочется привести аналог из жизни. Каждый человек выполняет определённые функции. Например, учится, работает, убирает квартиру, готовит еду и занимается другими очевидными вещами. Можете считать, что интерфейс - это область занятий, например, учёба, работа, уборка квартиры, готовка еды. А методы интерфейса - это уже конкретная задача в данной области. Например, в уборке квартиры могут быть такие методы: мойка посуды, мойка пола, вынос мусора и другие. В готовке еды могут быть такие методы: готовка борща, готовка мяса, чистка картошки и прочее. Надеюсь, мысль Вы уловили.

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

Давайте разберём простой пример, создав следующий интерфейс (в файле "fileinterface.php"):

<?php
interface FileInterface {
public function readFromFile($path);
public function writeToFile($path, $some);
}
?>

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

Создадим ещё один интерфейс (в файле "client.php"):

<?php
interface Client {
public function buy ($id);
public function repayment($id);
}
?>

Данный интерфейс реализует функцию клиента, то есть можно что-то купить (задаётся $id), а также что-то возвратить обратно (тоже задаётся по $id).

И, наконец, класс, который реализует эти интерфейсы, то есть класс у которого области задач две - быть клиентом и работать с файлом (файл "shop.php"):

<?php
  require_once "fileinterface.php";
  require_once "client.php";
class Shop implements FileInterface, Client{
public function readFromFile($path) {
      echo "Считываем из файла и возвращаем строку<br />";
}
public function writeToFile($path, $some) {
      echo "Записываем в файл данные $some<br />";
}
public function buy($id) {
      echo "Спасибо за покупку<br />";
      $this->writeToFile("data.db", "Был куплен товар $id");
}
public function repayment($id) {
      $this->readFromFile("data.db");
//Тут, допустим, проверка того, была ли на самом деле покупка товара $id
      $this->writeToFile("data.db", "Был сделан возврат товара $id");
}
}
?>

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

И, наконец, простой пример, который использует класс Shop:

<?php
  require_once "shop.php";
  $shop = new Shop();
  $shop->buy(5);
  $shop->repayment(5);
?>

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

Вот и всё, что хотелось сказать по интерфейсам в PHP.

До следующей статьи!