ЛУЧШИЙ САЙТ ДЛЯ ВЕБ-РАЗРАБОТЧИКОВ

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 Проверка формы PHP Обязательные поля формы PHP Форма URL/E-mail PHP Заполнение формы

PHP Расширенный

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

PHP ООП

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

MySQL База данных

MySQL База данных MySQL Подключение MySQL Создать БД MySQL Создать таблицы MySQL Вставить данные MySQL Получить последний ID MySQL Вставить несколько записей MySQL Подготовленные инструкции MySQL Выбрать данные MySQL Where MySQL Order By MySQL Удаление данных MySQL Обновление данных MySQL Ограничение данных

PHP XML

PHP XML Парсеры PHP SimpleXML Парсер PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

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

PHP Примеры

PHP Примеры PHP Компилятор PHP Викторина PHP Упражнения PHP Сертификат

PHP Справочник

PHP Обзор PHP Массив PHP Календарь PHP Дата PHP Каталог PHP Ошибка PHP Исключение PHP Файловая система PHP Фильтр PHP FTP PHP JSON PHP Ключевые слова PHP Libxml PHP Почта PHP Математика PHP Разное PHP MySQLi PHP Сеть PHP Output Control PHP RegEx PHP SimpleXML PHP Поток PHP Строка PHP Обработка переменных PHP XML Парсер PHP Zip PHP Часовые пояса

PHP. Уроки для начинающих

PHP ООП - Абстрактные классы


PHP - Что такое абстрактные классы и методы?

Абстрактные классы и методы - это когда родительский класс имеет именованный метод, но ему нужен дочерний класс (классы) для выполнения задач.

Абстрактный класс - это класс, который содержит хотя бы один абстрактный метод. Абстрактный метод - это метод, который объявлен, но не реализован в коде.

Абстрактный класс или метод определяется ключевым словом abstract:

Синтаксис абстрактного класса (метода)

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

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

Значит, когда дочерний класс наследуется от абстрактного класса, у нас есть следующие правила:

  • Метод дочернего класса должен быть определен с тем же именем, и он повторно объявляет родительский абстрактный метод
  • Метод дочернего класса должен быть определен с таким же или менее ограниченным модификатором доступа
  • Количество обязательных аргументов должно быть одинаковым. Тем не менее, дочерний класс может иметь дополнительные аргументы в добавок

Давайте посмотрим на пример:

Пример

<?php
// Родительский класс
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// Дочерние классы
class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!";
  }
}

// Создать объекты из дочерних классов
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>
Попробуйте сами »

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

Классы Audi, Volvo и Citroen унаследованы от класса Car. Это означает, что классы Audi, Volvo и Citroen могут использовать публичное свойство $name, а также публичный метод __construct() из класса Car из-за наследования.

Но intro() - это абстрактный метод, который должен быть определен во всех дочерних классах, и они должны возвращать строку.


PHP - Больше примеров абстрактного класса

Давайте посмотрим на другой пример, где абстрактный метод имеет аргумент:

Пример

<?php
abstract class ParentClass {
  // Абстрактный метод с аргументом
  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 {
  // Дочерний класс может определять необязательные аргументы, которых нет в абстрактном методе родителя.
  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");
?>
Попробуйте сами »