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

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Переопределение методов (method overriding) — ключевая концепция ООП в PHP, позволяющая дочернему классу изменить поведение метода, унаследованного от родителя.

  • Дочерний класс объявляет метод с тем же именем, что и в родительском
  • Новая реализация заменяет родительскую при вызове на объекте дочернего класса
  • Для вызова родительской версии используется parent::methodName()
  • Модификатор final запрещает переопределение метода

Пример: класс Cat наследует Animal и переопределяет метод speak(), чтобы возвращать "Мяу" вместо общего звука.

Практические задания PHP помогут освоить переопределение методов через интерактивные упражнения — изучение ООП онлайн с примерами кода и тестами бесплатно.

Список тем

1. Простое переопределение

id: 39150_override_01_replace

В этом задании вам нужно завершить переопределение метода в дочернем классе. Дан код с родительским классом `Animal`, который имеет метод `makeSound()`, возвращающий строку 'Some generic sound'. Дочерний класс `Dog` должен переопределить этот метод, чтобы возвращать строку 'Woof! Woof!'. В коде дочернего класса пропущены ключевые элементы объявления метода. Вам необходимо заполнить пропуски, чтобы метод был корректно объявлен и переопределял родительский. Обратите внимание на синтаксис объявления методов в PHP и использование ключевого слова для возврата значения.

Заполните пропуски
<?php

class Animal {
    public function makeSound() {
        return 'Some generic sound';
    }
}

class Dog extends Animal {
    public input1S makeSound() {
        input2S 'Woof! Woof!';
    }
}

$dog = new Dog();
echo $dog->makeSound();

?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Ошибка в переопределении

id: 39150_override_02_error

В этом фрагменте кода PHP есть ошибка, связанная с переопределением метода в дочернем классе. Родительский класс объявляет метод с определённой сигнатурой, а дочерний класс пытается его переопределить, но допускает ошибку. Найдите строку с ошибкой и исправьте её, чтобы код работал корректно и демонстрировал правильное переопределение методов.

Найдите ошибку и исправьте
<?php
class Animal {
    public function makeSound($volume) {
        echo "Animal sound at volume $volume\n";
    }
}
 
class Dog extends Animal {
    public function makeSound($vol) {
        echo "Woof! (volume: $vol)\n";
    }
}
 
$dog = new Dog();
$dog->makeSound(5);
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Собери иерархию классов

id: 39150_override_03_build

Из предложенных строк соберите корректный PHP-скрипт, который демонстрирует иерархию классов с переопределением метода. Родительский класс Animal должен иметь метод makeSound(), который выводит строку 'Some generic animal sound'. Дочерний класс Dog должен переопределить этот метод, чтобы выводить строку 'Woof! Woof!'. В решении должны присутствовать только необходимые строки для объявления классов, их методов и закрывающих скобок. Одна из строк является лишней и не должна входить в итоговый код.

Перетяните в правильном порядке строки из одного блока в другой
<?php
class Animal {
    public function makeSound() {
        echo 'Some generic animal sound';
    }
}
class Dog extends Animal {
    public function makeSound() {
        echo 'Woof! Woof!';
    }
}
    public function wagTail() {
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Какой метод вызовется?

id: 39150_override_04_predict

Проанализируйте представленный код на PHP, демонстрирующий переопределение методов в объектно-ориентированном программировании. Создаётся объект дочернего класса и вызывается метод. Вам необходимо определить, какой именно метод (родительского или дочернего класса) будет выполнен и что будет выведено в результате. Выберите правильный вариант из предложенных.

Выберите правильный вариант ответа
<?php
class ParentClass {
    public function showMessage() {
        echo "Сообщение из родительского класса";
    }
}

class ChildClass extends ParentClass {
    public function showMessage() {
        echo "Сообщение из дочернего класса";
    }
}

$obj = new ChildClass();
$obj->showMessage();
?>
Сообщения
Проверить
Показать подсказку

5. Термины ООП

id: 39150_override_05_compare

В левой колонке перечислены ключевые термины, связанные с переопределением методов в объектно-ориентированном программировании на PHP. В правой колонке приведены их определения. Сопоставьте каждый термин с соответствующим определением. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок определений перемешан. Для успешного выполнения задания необходимо понимать, как методы классов могут наследоваться, переопределяться и как ограничивается их изменение.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Переопределение
Наследование
parent
final
extends
Ключевое слово, которое запрещает дальнейшее переопределение метода в дочерних классах.
Ключевое слово, используемое для вызова метода или доступа к свойству родительского класса.
Механизм, при котором один класс (дочерний) получает свойства и методы другого класса (родительского).
Ключевое слово, используемое при объявлении класса для указания его родительского класса.
Механизм, позволяющий дочернему классу изменять реализацию метода, унаследованного от родительского класса.
Сообщения
Проверить
Показать подсказку

6. Порядок выполнения

id: 39150_override_06_sequencing

В этом задании представлены перемешанные шаги, описывающие процесс вызова переопределённого метода на объекте дочернего класса в PHP. Ваша задача — восстановить правильную последовательность этих шагов, отражающую порядок выполнения кода при таком вызове. Расставьте строки сверху вниз в том порядке, в котором они происходят фактически: от момента вызова метода на объекте до момента завершения его работы. Это поможет понять механизм наследования и переопределения методов в объектно-ориентированном программировании.

Расставьте строки в правильном порядке
Внутри метода дочернего класса может быть выполнен вызов родительской версии метода через parent::.
Если метод переопределён, выполняется его код из дочернего класса.
PHP проверяет, определён ли вызываемый метод в дочернем классе.
После завершения выполнения кода метода (дочернего и, возможно, родительского) управление возвращается в точку вызова.
Создаётся объект дочернего класса, и на нём вызывается переопределённый метод.
Выполняется код родительского метода (если он был вызван).
Сообщения
Проверить
Показать подсказку

7. Родитель или потомок?

id: 39150_override_07_sort

Перед вами список элементов, связанных с объектно-ориентированным программированием в PHP. Распределите их по трём категориям: «Относится к родительскому классу», «Относится к дочернему классу» и «Общее для обоих». Обратите внимание, что родительский класс (базовый класс) определяет общие свойства и методы, а дочерний класс (класс-наследник) может их переопределять или расширять. Элементы, которые могут встречаться в обоих классах, поместите в категорию «Общее для обоих».

Перетяните элементы в соответствующие блоки
Относится к родительскому классу
Относится к дочернему классу
Общее для обоих
parent::someMethod()
final public function calculate()
self::$property
protected $name;
parent::__construct()
public const VERSION = '1.0';
abstract public function render();
public function __construct()
public function overriddenMethod()
private $secret;
public static function create()
return new self();
Сообщения
Проверить
Показать подсказку

8. Вызов родительского метода

id: 39150_override_08_bank

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

Нужно правильно расставить в пропуски предложенные варианты
<?php
class ParentClass {
    public function displayMessage() {
        echo "Сообщение из родительского класса";
    }
}

class ChildClass extends ParentClass {
    public function displayMessage() {
        input1S
        echo " и дополнительное сообщение из дочернего класса";
    }
}

$obj = new ChildClass();
$obj->input2S();
?>
parent::displayMessage();
displayMessage
ParentClass::displayMessage();
echo 'Сообщение из родительского класса';
parent->displayMessage();
displayMessage()
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

9. Что выведет код?

id: 39150_override_09_give_result

Проанализируйте приведённый фрагмент PHP-кода, в котором демонстрируется переопределение метода в объектно-ориентированном программировании. Создаётся объект дочернего класса, вызывается метод, который был переопределён в этом классе. Определите, какая строка будет выведена на экран в результате выполнения кода. Введите только саму строку без кавычек и дополнительных символов.

Что должно получиться?
<?php
    class ParentClass {
        public function getMessage() {
            return "Message from parent";
        }
    }
    
    class ChildClass extends ParentClass {
        public function getMessage() {
            return "Message from child";
        }
    }
    
    $obj = new ChildClass();
    echo $obj->getMessage();
?>
Сообщения
Проверить
Показать подсказку

10. Найди переопределённые методы

id: 39150_override_10_click

Перед вами фрагмент кода на PHP, содержащий иерархию классов с наследованием. Внимательно изучите код и найдите все методы, которые являются переопределёнными. Переопределённый метод — это метод в дочернем классе, который имеет то же имя и сигнатуру (количество и тип параметров), что и метод в родительском классе. Отметьте кликом только эти переопределённые методы. Не отмечайте методы, которые являются новыми (не существующими в родительском классе) или методы, которые не меняются в дочерних классах.

Кликните по всем фрагментам, которые подходят под условие задания.
<?php

class Vehicle {
    protected $speed;
    
    public function {{startEngine~|~t1}}() {
        echo "Двигатель транспортного средства запущен.";
    }
    
    public function {{stopEngine~|~t2}}() {
        echo "Двигатель остановлен.";
    }
    
    public function {{getMaxSpeed~|~t3}}() {
        return 0;
    }
}

class Car extends Vehicle {
    private $fuelLevel;
    
    public function {{startEngine~|~t4}}() {
        echo "Автомобильный двигатель заведён.";
    }
    
    public function {{refuel~|~t5}}($amount) {
        $this->fuelLevel += $amount;
    }
    
    public function {{getMaxSpeed~|~t6}}() {
        return 180;
    }
}

class Motorcycle extends Vehicle {
    public function {{startEngine~|~t7}}() {
        echo "Мотоциклетный двигатель запущен.";
    }
    
    public function {{leanIntoTurn~|~t8}}() {
        echo "Наклон в повороте.";
    }
    
    public function {{honkHorn~|~t9}}() {
        echo "Бип-бип!";
    }
}

$car = new Car();
$car->startEngine();
$car->refuel(20);

?>
Сообщения
Проверить
Показать подсказку

11. Разметь элементы класса

id: 39150_override_11_highlight

В данном задании представлен код дочернего класса на PHP, который наследует родительский класс и переопределяет его метод. Вам необходимо разметить ключевые элементы, связанные с наследованием и переопределением. Для каждого выделенного сегмента укажите его тип: «ключевое слово extends», «имя родительского класса», «переопределённый метод» или «вызов parent». Обратите внимание, что ключевое слово extends указывает на наследование, имя родительского класса следует после него, переопределённый метод — это метод в дочернем классе с тем же именем, что и в родительском, а вызов parent:: используется для обращения к методу родительского класса.

Кликните по каждому выделенному фрагменту и выберите для него подходящий тип из списка под текстом.
class Child {{extends~|~t1}} {{Parent~|~t2}} {
    public function {{exampleMethod~|~t3}}() {
        echo "Дочерний класс";
        {{parent::exampleMethod~|~t4}}();
    }
}
вызов parent
переопределённый метод
имя родительского класса
ключевое слово extends
Сообщения
Проверить
Показать подсказку

PHP: запуск кода в браузере

id: 39150_compiler
🐘
Запустить тренажёр (PHP)
НайтиКурс.Ру