Предоставляется ИНТЕРФЕЙС, чтобы вы могли описать набор функций и затем скрыть окончательную реализацию этих функций в классе реализации. Это позволяет вам изменить ОСУЩЕСТВЛЕНИЕ этих функций без изменения способа их использования.
Например: у меня есть база данных. Я хочу написать класс, который обращается к данным в моей базе данных. Я определяю интерфейс следующим образом:
interface Database {
function listOrders();
function addOrder();
function removeOrder();
...
}
Тогда, скажем, мы начинаем использовать базу данных MySQL. Итак, мы пишем класс для доступа к базе данных MySQL:
class MySqlDatabase implements Database {
function listOrders() {...
}
мы пишем эти методы по мере необходимости, чтобы добраться до таблиц базы данных MySQL. Затем вы можете написать свой контроллер для использования интерфейса следующим образом:
$database = new MySqlDatabase();
foreach ($database->listOrders() as $order) {
Тогда, скажем, мы решили перейти на базу данных Oracle. Мы могли бы написать другой класс для доступа к базе данных Oracle как таковой:
class OracleDatabase implements Database {
public function listOrders() {...
}
Затем - чтобы переключить наше приложение на использование базы данных Oracle вместо базы данных MySQL, нам нужно всего лишь изменить ОДНУ СТРОКУ кода:
$database = new OracleDatabase();
все остальные строки кода, такие как:
foreach ($database->listOrders() as $order) {
останется без изменений. Дело в том, что ИНТЕРФЕЙС описывает методы, которые нам нужны для доступа к нашей базе данных. Это НЕ описывает, каким образом мы этого добиваемся. Вот что делает класс IMPLEMENTing. Мы можем РЕАЛИЗОВАТЬ этот интерфейс столько раз, сколько нам нужно, так много разных способов, как нам нужно. Затем мы можем переключаться между реализациями интерфейса без ущерба для нашего кода, потому что интерфейс определяет, как мы будем его использовать, независимо от того, как он на самом деле работает.