Интерфейсы в 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();
?>
Результат выполнения кода:
Реализация нескольких интерфейсов
Мы можем реализовать несколько интерфейсов в одном классе и таким образом обойти закон, запрещающий наследование от более чем одного родительского класса.
В следующем примере класс 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();
?>
Результат выполнения кода:
Примечание: Вы можете расширить только один класс, в то же время вы можете реализовать несколько интерфейсов.
Расширение интерфейсов
Интерфейсы также могут расширять интерфейсы:
Пример
<?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 абстрактного класса |
Заключение
В этом уроке мы научились создавать и реализовывать интерфейсы, а также узнали о различиях между абстрактными классами и интерфейсами. Щелкните здесь, чтобы закрепить полученные знания на практике.