Ключевое слово parent::
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 22 из 91.
Когда дочерний class наследует от parent, иногда необходимо напрямую обращаться к методам или properties parent. Ключевое слово parent:: позволяет вызвать реализацию parent class из дочернего class.
Это особенно полезно в конструкторах, когда дочернему классу нужно инициализировать свойства родительского класса, одновременно настраивая собственные:
<?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::, чтобы вызвать любой родительский метод, а не только constructor. Это становится особенно важно, когда вы хотите расширить поведение метода, а не полностью заменить его.
Ключевой момент: Ключевое слово parent:: предоставляет способ доступа к реализации родительского класса. Это необходимо для правильной цепочки вызовов конструкторов и для расширения унаследованной функциональности вместо её переписывания.
Задание
ЛегкоДавайте создадим систему каталога продуктов, которая демонстрирует, как дочерние class могут расширять функциональность parent с помощью ключевого слова parent::, чтобы правильно выстраивать цепочку constructor и дополнять унаследованные method.
Вы организуете код в трёх файлах:
Product.php: Define classProduct, который служит base для всех продуктов. У него должны быть public properties$nameи$price. constructor accepts имя и цену, устанавливая оба properties. Добавьте methodgetDetails(), который returns"[name]: $[price]".ElectronicProduct.php: Define classElectronicProduct, который extendsProduct. В начале подключите файл Product. Этот class добавляет property$warranty(в месяцах). constructor должен accepts имя, цену и warranty: используйтеparent::__construct(), чтобы initialize имя и цену через parent, затем установите warranty yourself. Create methodgetDetails(), который расширяет реализацию parent: вызовитеparent::getDetails()и добавьте к результату" (Warranty: [warranty] months)".main.php: Подключите файл ElectronicProduct. Вы получите три inputs: имя продукта, цену (как string для преобразования в число с плавающей точкой) и период warranty (как string для преобразования в целое число). CreateElectronicProductс этими values и print result вызоваgetDetails().
Этот challenge показывает настоящую силу parent::. Не только для объединения constructor, но и для расширения поведения method. Ваш ElectronicProduct повторно использует логику форматирования parent и добавляет поверх неё собственные details, избегая дублирования кода и создавая более информативный result.
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP