Menu
Coddy logo textTech

Абстрактные классы

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 25 из 91.

abstract class — это class, экземпляр которого нельзя создать напрямую. Он служит шаблоном для других class, определяя method, которые дочерние class должны Implement. Вы создаёте abstract class с помощью ключевого слова abstract.

<?php
abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;
    
    public function __construct($color, $width, $height) {
        parent::__construct($color);
        $this->width = $width;
        $this->height = $height;
    }
    
    public function calculateArea() {
        return $this->width * $this->height;
    }
}

$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();

Вывод:

15

class Shape объявляет abstract method calculateArea(), не предоставляя его реализацию. Любой class, использующий Shape через extends, должен implement этот method. Обрати внимание, что abstract class также могут содержать обычные method, такие как getColor(), которые дочерние class наследуют напрямую.

abstract методы определяют, что должен делать дочерний class, но не то, как именно. Это гарантирует, что все фигуры имеют метод calculateArea(), позволяя каждой фигуре вычислять свою площадь по-разному.

Ключевой момент: Абстрактные классы объединяют структуру наследования с обязательными требованиями. Используй их, когда хочешь совместно использовать код связанными классами, обеспечивая при этом реализацию определённых методов каждым дочерним классом.

challenge icon

Задание

Легко

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

Вы организуете код в трёх файлах:

  • Media.php: Define abstract Media class, который служит шаблоном для всех типов медиа. В нём должны быть protected $title property и constructor, который accepts и sets заголовок. Добавьте abstract method с именем play(), который дочерние классы должны Implement. Также добавьте обычный method getTitle(), который returns заголовок. Этот concrete method будет унаследован всеми дочерними классами.
  • Song.php: Define Song class, который extends Media. Подключите файл Media в начале. Этот class добавляет $artist property. Constructor должен accepts title и artist: используйте parent::__construct() для title, затем самостоятельно установите artist. Implement требуемый play() method, чтобы он returns "Playing song: [title] by [artist]".
  • Podcast.php: Define Podcast class, который extends Media. Подключите файл Media в начале. Этот class добавляет $episode property (integer). Constructor должен accepts title и episode number: используйте parent::__construct() для title, затем установите episode. Implement требуемый play() method, чтобы он returns "Playing podcast: [title] - Episode [episode]".

В main.php подключите оба файла Song и Podcast. Вы получите четыре входных значения: название песни, имя исполнителя, название подкаста и номер эпизода (в виде строки, которую нужно преобразовать в integer). Создайте Song и Podcast object с этими значениями. Сначала Print result вызова play() для песни, затем для подкаста — каждый результат на отдельной строке.

Этот challenge показывает, как abstract классы определяют контракт: каждый тип медиа должен иметь method play(), но каждый тип Implement его по-разному. Abstract Media class нельзя создать напрямую; он существует только для предоставления структуры и общей функциональности своим дочерним классам.

Попробуйте сами

<?php
require_once 'Song.php';
require_once 'Podcast.php';

// Читать входные данные
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));

// TODO: Создать объект Song с songTitle и artistName

// TODO: Создать объект Podcast с podcastTitle и episodeNumber

// TODO: Вывести результат вызова play() для song

// TODO: Вывести результат вызова play() для podcast

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP