НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ

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. W3Schools українською. Уроки для початківців

En

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");
?>
Спробуйте самі »