PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


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




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


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

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

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

Интерфейсы могут содержать методы и / или константы, но не атрибуты. Интерфейсные константы имеют те же ограничения, что и константы класса. Методы интерфейса неявно абстрактны. Интерфейсы определяются с помощью ключевого слова interface, за которым следует имя интерфейса:

Пример

<?php
Interface MyFirstInterface {
    const BAR = 'BAR';

    public function doSomething($param1, $param2);
}
?>

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

В отличие от методов абстрактного класса, которые могут быть публичными или защищенными, все методы интерфейса должны быть только публичными:

Пример

<?php
interface InterfaceName {
  public function someMethod1();
  public function someMethod2($name, $color);
  public function someMethod3() : string;
}
?>

Примечание: Интерфейсы не должны объявлять конструкторы или деструкторы, поскольку это детали реализации на уровне класса.

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

Пример

<?php
interface interfaceName { 
  // абстрактные методы
}
 
class Child implements interfaceName {
  // определяет методы интерфейса и может иметь собственный код
}
?>

В приведенном ниже примере мы создадим интерфейс для классов, управляющих автомобилями, который передает все свои методы setModel() и getModel() классам, реализующим интерфейс:

Пример

<?php
interface Car { 
  public function setModel($name);
  
  public function getModel();
}
?>

Интерфейсы, как и абстрактные классы, включают абстрактные методы и константы. Однако, в отличие от абстрактных классов, интерфейсы могут иметь только публичные методы и не могут иметь переменных.

Классы, реализующие интерфейсы, должны определять все методы, которые они наследуют от интерфейсов, включая все параметры. В следующем примере в конкретном классе с именем miniCar добавим код ко всем абстрактным методам:

<?php
interface Car { 
  public function setModel($name);  
  public function getModel();
}

class miniCar implements Car {
  private $model; 
   
  public function setModel($name) { 
    $this -> model = $name; 
  }  
  public function getModel() {
    return $this -> model; 
  }
}

$car = new miniCar();
$car -> setModel('Mercedes Benz');
echo $car -> getModel();
?>

Результат выполнения кода:

Mercedes Benz

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

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

<?php
Interface MyInterface1 {
  public function myMethod1();
}
Interface MyInterface2 {
  public function myMethod2();
}
class MyClass implements MyInterface1, MyInterface2 {
  public function myMethod1() {
    echo "Привет ";
  }
  public function myMethod2() {
    echo "Мир!";
  }
}
$obj = new MyClass();
$obj -> myMethod1();
$obj -> myMethod2();
?>

Результат выполнения кода:

Привет Мир!

Класс может расширять класс, а также реализовывать один или несколько интерфейсов:

<?php
Interface MyInterface {
  public function write();
}
class ParentClass {
  public $name;
  public function __construct($name) {
    $this -> name = $name;
  }
}
class ChildClass extends ParentClass  implements MyInterface {
  function write() {
    echo $this -> name;
  }
}
$child = new ChildClass('Max Maxsimov');
$child -> write();
?>

Результат выполнения кода:

Max Maxsimov

Примечание: Вы можете расширить только один класс, в то же время вы можете реализовать несколько интерфейсов.

Интерфейсы также могут расширять интерфейсы:

Пример

<?php
Interface MyInterface1 {
  public function myMethod1();
}
Interface MyInterface2 extends MyInterface1 {
  public function myMethod2();
}
class MyClass1 implements MyInterface1 {
  # нужен только этот метод
  public function myMethod1() {}
}
class MyClass2 implements MyInterface2 {
  # должны быть объявлены как myMethod1, так и myMethod2
  public function myMethod1() {}
  public function myMethod2() {}
}
?>

В таблице приведены несколько важных различий между абстрактным классом и интерфейсом:

интерфейс абстрактный класс
код - абстрактные методы
- константы
- абстрактные методы
- константы
- конкретные методы
- конкретные переменные
модификаторы доступа - публичные - публичные
- защищенные
количество родителей Один и тот же класс может реализовывать более 1 интерфейса Дочерний класс может наследовать только от 1 абстрактного класса

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