Интерфейсы в 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.
До следующей статьи!
-
- Михаил Русаков
Комментарии (12):
Михаил, у вас в системе комментариев по моему ошибка! Если я жму кнопку "Ответить", То ничего не происходит! Также не работает кнопка "Получать уведомление на E-mail об ответах на Ваш комментарий" Хотя в прочем она и не нужна, потому что ответы приходят и так, автоматически!
Ответить
Также не работает кнопка "Редактировать"! Не знаю, может быть это только у меня так! Браузер IE(Internet Explorer) 8
Ответить
А возможно ли однавременное наследование какого-лтбо класса+реализация интерфейсов? То есть например class women extends people implements Uborka, Gotovka и еще вопрос, что будет если в двух интерфейсах определенны одинаково называющиеся методы?
Ответить
Одновременное наследование классов и реализация интерфейса возможна, именно в таком порядке. А вот два интерфейса не могут содержать одинаковые методы.
Ответить
В чем существенная разница между абстрактным классом и интерфейсом
Ответить
Абстрактный класс - это самый обычный класс, в котором есть хотя бы 1 абстрактный метод. Помимо него могут быть и свойства, и методы с реализацией. А интерфейс не имеет никаких свойств, и все его методы не имеют реализацию.
Ответить
А зачем это нужно? Можете привести пример, где это действительно необходимо? Почему нельзя обойтись без интерфейса и просто задать методы в классах? какая разница?
Ответить
Почитайте про паттерны проектирования, там написаны и примеры, и многое другое, где всё это используется. В двух словах о примере не рассказать, но используется это для создания понятной архитектуры программы в целом.
Ответить
В php есть много вложенных функции. А есть ли в php вложенные классы, интерфейсы, как в Java? В php просто много функции. Было бы луче если их сгруппировать по интерфейсам или классам, я так думаю.
Ответить
Есть, например, mysqli.
Ответить
Спасибо за статью!
Ответить
Полезная статья. Спасибо
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.