Вы находитесь на странице: 1из 17

Понимание и применение

Интерфейсов и
Абстрактных классов
PHP ООП — абстрактные классы

• PHP — что такое абстрактные классы и методы?


• Абстрактные классы и методы — это когда родительский класс
имеет именованный метод, но нуждается в дочерних классах для
выполнения задач.
• Абстрактный класс — это класс, который содержит хотя бы один
абстрактный метод. Абстрактный метод — это метод, который
объявлен, но не реализован в коде.
• Абстрактный класс или метод определяется ключевым словом
abstract :
синтаксис
• <?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>
• При наследовании от абстрактного класса метод дочернего класса
должен быть определен с тем же именем и тем же или менее
ограниченным модификатором доступа. Таким образом, если
абстрактный метод определен как защищенный, метод дочернего
класса должен быть определен либо как защищенный, либо как
общедоступный, но не как частный. Кроме того, тип и количество
обязательных аргументов должны быть одинаковыми. Однако
дочерние классы могут иметь дополнительные аргументы.
• Итак, когда дочерний класс наследуется от абстрактного класса, у
нас есть следующие правила:
• Метод дочернего класса должен быть определен с тем же
именем, и он переопределяет родительский абстрактный метод.
• Метод дочернего класса должен быть определен с тем же или
менее ограниченным модификатором доступа.
• Количество обязательных аргументов должно быть одинаковым.
Однако дочерний класс может иметь дополнительные аргументы.
• Давайте посмотрим на пример:
• <?php
// Parent class
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
 }
  abstract public function intro() : string;
}

// Child classes
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
 }
}

// Create objects from the child classes


$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

?>
Объяснение примера

• Классы Audi, Volvo и Citroen наследуются от класса Car. Это


означает, что классы Audi, Volvo и Citroen могут использовать
общедоступное свойство $name, а также общедоступный метод
__construct() класса Car из-за наследования.
• Но intro() — это абстрактный метод, который должен быть
определен во всех дочерних классах, и они должны возвращать
строку.
PHP — дополнительные примеры абстрактных классов
Давайте посмотрим на другой пример, где у абстрактного
метода есть аргумент:
• <?php
abstract class ParentClass {
  // Abstract method with an argument
  abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {


  public function prefixName($name) {
    if ($name == "John Doe") {
      $prefix = "Mr.";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs.";
    } else {
      $prefix = "";
    }
    return "{$prefix} {$name}";
 }
}

$class = new ChildClass;


echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
Давайте посмотрим на другой пример, где у абстрактного метода есть
аргумент, а у дочернего класса есть два необязательных аргумента,
которые не определены в абстрактном методе родителя:

• <?php
abstract class ParentClass {
    abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {


  // The child class may define optional arguments that are not in the parent's abstract method
  public function prefixName($name, $separator = ".", $greet = "Dear") {
    if ($name == "John Doe") {
      $prefix = "Mr";
    } elseif ($name == "Jane Doe") {
      $prefix = "Mrs";
    } else {
      $prefix = "";
    }
    return "{$greet} {$prefix}{$separator} {$name}";
 }
}

$class = new ChildClass;


echo $class->prefixName("John Doe");
echo "<br>";
echo $class->prefixName("Jane Doe");
?>
PHP ООП — Интерфейсы

• PHP — что такое интерфейсы?


• Интерфейсы позволяют указать, какие методы должен
реализовывать класс.
• Интерфейсы упрощают использование различных классов одним
и тем же способом. Когда один или несколько классов
используют один и тот же интерфейс, это называется
«полиморфизмом».
• Интерфейсы объявляются с помощью interfaceключевого слова:
Синтаксис
• <?php
interface InterfaceName {
  public function someMethod1();
  public function someMethod2($name, $color);
  public function someMethod3() : string;
}
?>
• PHP — интерфейсы против абстрактных классов
• Интерфейс похож на абстрактные классы. Разница между
интерфейсами и абстрактными классами заключается в следующем:
• Интерфейсы не могут иметь свойств, а абстрактные классы могут
• Все методы интерфейса должны быть общедоступными, а методы
абстрактного класса — общедоступными или защищенными.
• Все методы в интерфейсе являются абстрактными, поэтому их нельзя
реализовать в коде, а ключевое слово abstract не требуется.
• Классы могут реализовывать интерфейс, одновременно наследуя от
другого класса.
• PHP — использование интерфейсов
• Чтобы реализовать интерфейс, класс должен использовать
implementsключевое слово.
• Класс, реализующий интерфейс, должен реализовывать все
методы интерфейса.
Пример
• <?php
interface Animal {
  public function makeSound();
}

class Cat implements Animal {


  public function makeSound() {
    echo "Meow";
 }
}

$animal = new Cat();


$animal->makeSound();
?>
• Из приведенного выше примера предположим, что мы хотели бы
написать программное обеспечение, которое управляет группой
животных. Есть действия, которые могут делать все животные, но
каждое животное делает это по-своему.
• Используя интерфейсы, мы можем написать некоторый код,
который будет работать для всех животных, даже если каждое
животное ведет себя по-разному:
• <?php
interface Animal {
  public function makeSound();
}

class Cat implements Animal {


  public function makeSound() {
    echo " Meow ";
 }
}

class Dog implements Animal {


  public function makeSound() {
    echo " Bark ";
 }
}

$cat = new Cat();


$dog = new Dog();
$animals = array($cat, $dog);

foreach($animals as $animal) {
  $animal->makeSound();
}
?>
Объяснение примера

• Cat, Dog — все это классы, реализующие интерфейс Animal, что


означает, что все они могут издавать звук с помощью метода
makeSound(). Из-за этого мы можем пройтись по всем животным
и попросить их издать звук, даже если мы не знаем, к какому типу
относится каждое из них.
• Поскольку интерфейс не сообщает классам, как реализовать
метод, каждое животное может издавать звук по-своему.

Вам также может понравиться