Ключевое слово parent::
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 22 из 91.
Когда дочерний класс наследуется от родительского, иногда вам нужно получить доступ к методам или свойствам родителя напрямую. Ключевое слово parent:: позволяет вызывать реализацию родительского класса из дочернего класса.
Это особенно полезно в конструкторах, когда дочернему классу необходимо инициализировать свойства родительского класса, одновременно настраивая свои собственные:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
Вывод:
Max is a LabradorВызывая parent::__construct($name), дочерний класс повторно использует логику инициализации родительского класса вместо её дублирования. Без этого вызова свойство $name никогда не будет установлено.
Вы можете использовать parent:: для вызова любого родительского метода, а не только конструкторов. Это становится особенно важным, когда вы хотите расширить поведение метода, а не полностью заменить его.
Ключевой момент: Ключевое слово parent:: предоставляет способ доступа к реализации родительского класса. Это необходимо для правильной цепочки вызовов конструкторов и для расширения унаследованной функциональности вместо её полной перезаписи.
Задание
ЛегкоДавайте создадим систему каталога товаров, которая демонстрирует, как дочерние классы могут расширять функциональность родительских классов, используя ключевое слово parent:: для правильной цепочки конструкторов и дополнения унаследованных методов.
Вы организуете свой код в трех файлах:
Product.php— Определите классProduct, который служит базой для всех товаров. Он должен иметь публичные свойства$nameи$price. Конструктор принимает имя и цену, устанавливая оба свойства. Включите методgetDetails(), который возвращает"[name]: $[price]".ElectronicProduct.php— Определите классElectronicProduct, который расширяетProduct. Подключите файл Product в начале. Этот класс добавляет свойство$warranty(в месяцах). Конструктор должен принимать имя, цену и гарантию — используйтеparent::__construct()для инициализации имени и цены через родительский класс, а затем установите гарантию самостоятельно. Создайте методgetDetails(), который основывается на реализации родителя: вызовитеparent::getDetails()и добавьте к нему" (Warranty: [warranty] months)".main.php— Подключите файл ElectronicProduct. Вы получите три входных значения: название товара, цену (в виде строки для преобразования в float) и гарантийный срок (в виде строки для преобразования в integer). Создайте объектElectronicProductс этими значениями и выведите результат вызоваgetDetails().
Эта задача показывает реальную силу parent:: — не только для цепочки конструкторов, но и для расширения поведения методов. Ваш ElectronicProduct повторно использует логику форматирования родителя и добавляет свои собственные детали, избегая дублирования кода и создавая более информативный вывод.
Шпаргалка
Ключевое слово parent:: позволяет дочернему классу обращаться к методам и свойствам своего родительского класса.
Используйте parent::__construct() для вызова конструктора родителя из дочернего класса:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
}
Вы также можете использовать parent:: для вызова любого родительского метода и расширения его поведения:
<?php
class Animal {
public function describe() {
return "This is an animal";
}
}
class Dog extends Animal {
public function describe() {
return parent::describe() . " and it's a dog";
}
}
Этот подход позволяет дочерним классам повторно использовать логику родителя вместо дублирования кода, обеспечивая правильную цепочку конструкторов и расширение методов.
Попробуйте сами
<?php
require_once 'ElectronicProduct.php';
// Считать входные данные
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Создать ElectronicProduct с входными значениями
// и вывести результат вызова getDetails()
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy