Переопределение методов (method overriding) — ключевая концепция ООП в PHP, позволяющая дочернему классу изменить поведение метода, унаследованного от родителя.
- Дочерний класс объявляет метод с тем же именем, что и в родительском
- Новая реализация заменяет родительскую при вызове на объекте дочернего класса
- Для вызова родительской версии используется
parent::methodName() - Модификатор
finalзапрещает переопределение метода
Пример: класс Cat наследует Animal и переопределяет метод speak(), чтобы возвращать "Мяу" вместо общего звука.
Практические задания PHP помогут освоить переопределение методов через интерактивные упражнения — изучение ООП онлайн с примерами кода и тестами бесплатно.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Iterator интерфейс
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- IteratorAggregate интерфейс
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Функция htmlspecialchars().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Переопределение методов.
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
1. Простое переопределение
В этом задании вам нужно завершить переопределение метода в дочернем классе. Дан код с родительским классом `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();
?>2. Ошибка в переопределении
В этом фрагменте кода PHP есть ошибка, связанная с переопределением метода в дочернем классе. Родительский класс объявляет метод с определённой сигнатурой, а дочерний класс пытается его переопределить, но допускает ошибку. Найдите строку с ошибкой и исправьте её, чтобы код работал корректно и демонстрировал правильное переопределение методов.
<?phpclass 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. Собери иерархию классов
Из предложенных строк соберите корректный PHP-скрипт, который демонстрирует иерархию классов с переопределением метода. Родительский класс Animal должен иметь метод makeSound(), который выводит строку 'Some generic animal sound'. Дочерний класс Dog должен переопределить этот метод, чтобы выводить строку 'Woof! Woof!'. В решении должны присутствовать только необходимые строки для объявления классов, их методов и закрывающих скобок. Одна из строк является лишней и не должна входить в итоговый код.
<?phpclass Animal { public function makeSound() { echo 'Some generic animal sound'; }}class Dog extends Animal { public function makeSound() { echo 'Woof! Woof!'; }} public function wagTail() {?>4. Какой метод вызовется?
Проанализируйте представленный код на PHP, демонстрирующий переопределение методов в объектно-ориентированном программировании. Создаётся объект дочернего класса и вызывается метод. Вам необходимо определить, какой именно метод (родительского или дочернего класса) будет выполнен и что будет выведено в результате. Выберите правильный вариант из предложенных.
<?php
class ParentClass {
public function showMessage() {
echo "Сообщение из родительского класса";
}
}
class ChildClass extends ParentClass {
public function showMessage() {
echo "Сообщение из дочернего класса";
}
}
$obj = new ChildClass();
$obj->showMessage();
?>5. Термины ООП
В левой колонке перечислены ключевые термины, связанные с переопределением методов в объектно-ориентированном программировании на PHP. В правой колонке приведены их определения. Сопоставьте каждый термин с соответствующим определением. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок определений перемешан. Для успешного выполнения задания необходимо понимать, как методы классов могут наследоваться, переопределяться и как ограничивается их изменение.
6. Порядок выполнения
В этом задании представлены перемешанные шаги, описывающие процесс вызова переопределённого метода на объекте дочернего класса в PHP. Ваша задача — восстановить правильную последовательность этих шагов, отражающую порядок выполнения кода при таком вызове. Расставьте строки сверху вниз в том порядке, в котором они происходят фактически: от момента вызова метода на объекте до момента завершения его работы. Это поможет понять механизм наследования и переопределения методов в объектно-ориентированном программировании.
7. Родитель или потомок?
Перед вами список элементов, связанных с объектно-ориентированным программированием в PHP. Распределите их по трём категориям: «Относится к родительскому классу», «Относится к дочернему классу» и «Общее для обоих». Обратите внимание, что родительский класс (базовый класс) определяет общие свойства и методы, а дочерний класс (класс-наследник) может их переопределять или расширять. Элементы, которые могут встречаться в обоих классах, поместите в категорию «Общее для обоих».
parent::someMethod()final public function calculate()self::$propertyprotected $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. Вызов родительского метода
В этом задании вам нужно дополнить код дочернего класса, который переопределяет метод родительского класса. В переопределённом методе должен быть вызов родительской версии метода через конструкцию parent::. Используйте выпадающие списки, чтобы выбрать правильные элементы из банка вариантов и заполнить пропуски в коде. Обратите внимание на синтаксис вызова родительского метода и правильное использование кавычек для строковых значений.
<?php
class ParentClass {
public function displayMessage() {
echo "Сообщение из родительского класса";
}
}
class ChildClass extends ParentClass {
public function displayMessage() {
input1S
echo " и дополнительное сообщение из дочернего класса";
}
}
$obj = new ChildClass();
$obj->input2S();
?>9. Что выведет код?
Проанализируйте приведённый фрагмент 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. Найди переопределённые методы
Перед вами фрагмент кода на 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. Разметь элементы класса
В данном задании представлен код дочернего класса на PHP, который наследует родительский класс и переопределяет его метод. Вам необходимо разметить ключевые элементы, связанные с наследованием и переопределением. Для каждого выделенного сегмента укажите его тип: «ключевое слово extends», «имя родительского класса», «переопределённый метод» или «вызов parent». Обратите внимание, что ключевое слово extends указывает на наследование, имя родительского класса следует после него, переопределённый метод — это метод в дочернем классе с тем же именем, что и в родительском, а вызов parent:: используется для обращения к методу родительского класса.
class Child {{extends~|~t1}} {{Parent~|~t2}} {
public function {{exampleMethod~|~t3}}() {
echo "Дочерний класс";
{{parent::exampleMethod~|~t4}}();
}
}