Menu
Coddy logo textTech

Переопределение методов

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

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

Чтобы переопределить method, просто определите method в дочернем class с тем же именем, что и у method parent:

<?php
class Animal {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
    
    public function speak() {
        return "$this->name makes a sound";
    }
}

class Cat extends Animal {
    public function speak() {
        return "$this->name says meow";
    }
}

$cat = new Cat("Whiskers");
echo $cat->speak();

Вывод:

Whiskers says meow

Класс Cat completely заменяет parent’s speak() method своей версией. Когда вы вызываете speak() у объекта cat, PHP использует реализацию дочернего класса.

Вы также можете расширить поведение parent, объединив parent:: со своей собственной логикой:

<?php
class Dog extends Animal {
    public function speak() {
        return parent::speak() . " - woof woof!";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();

Вывод:

Rex makes a sound - woof woof!

Ключевой момент: Переопределение method позволяет дочерним классам настраивать унаследованное behavior. Вы можете полностью заменить method или использовать parent::, чтобы расширить исходную реализацию.

challenge icon

Задание

Легко

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

Вы создадите три файла, которые будут работать вместе для отправки разных типов уведомлений, каждый со своим уникальным behavior:

  • Notification.php: Определите class Notification, который служит базовым для всех типов уведомлений. У него должно быть свойство $recipient с модификатором public и constructor, который принимает и устанавливает получателя. Включите method send($message), который возвращает "Sending to [recipient]: [message]".
  • UrgentNotification.php: Определите class UrgentNotification, который extends Notification. В верхней части подключите файл Notification. Этот class должен полностью переопределить method send($message), чтобы он возвращал "URGENT to [recipient]: [message]!!!": обратите внимание на префикс "URGENT" и восклицательные знаки в конце. Это демонстрирует полную замену behavior parent.
  • LoggedNotification.php: Определите class LoggedNotification, который extends Notification. В верхней части подключите файл Notification. Этот class должен переопределить send($message), но использовать реализацию parent: вызовите parent::send($message) и добавьте " [logged]" к result. Это демонстрирует расширение, а не замену behavior.

В main.php подключите все три файла class уведомлений. Вы получите два входных значения: имя получателя и отправляемое сообщение. Создайте по одному instance каждого типа уведомлений (все используют одного и того же получателя), затем вызовите send() с сообщением для каждого из них. Выведите каждый result в отдельной строке в следующем order: обычное уведомление, срочное уведомление, затем уведомление с logged.

Этот challenge демонстрирует оба подхода к переопределению method: UrgentNotification полностью заменяет логику parent собственным форматированием, тогда как LoggedNotification использует parent::, чтобы сохранить исходный behavior и дополнить его.

REQUIRED OUTPUT FORMAT: [Your translated content here]

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

<?php

require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';

// Прочитать ввод
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Создать по одному экземпляру каждого типа уведомления (все с одним и тем же получателем)

// TODO: Вызвать send() с сообщением для каждого уведомления
// Вывести каждый результат на отдельной строке в следующем порядке:
// 1. Обычное уведомление
// 2. Срочное уведомление
// 3. Логируемое уведомление

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

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

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

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