Menu
Coddy logo textTech

Ключевое слово 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:: предоставляет способ доступа к реализации родительского класса. Это необходимо для правильной цепочки вызовов конструкторов и для расширения унаследованной функциональности вместо её переписывания.

challenge icon

Задание

Легко

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

Вы организуете код в трёх файлах:

  • Product.php: Define class Product, который служит base для всех продуктов. У него должны быть public properties $name и $price. constructor accepts имя и цену, устанавливая оба properties. Добавьте method getDetails(), который returns "[name]: $[price]".
  • ElectronicProduct.php: Define class ElectronicProduct, который extends Product. В начале подключите файл Product. Этот class добавляет property $warranty (в месяцах). constructor должен accepts имя, цену и warranty: используйте parent::__construct(), чтобы initialize имя и цену через parent, затем установите warranty yourself. Create method getDetails(), который расширяет реализацию parent: вызовите parent::getDetails() и добавьте к результату " (Warranty: [warranty] months)".
  • main.php: Подключите файл ElectronicProduct. Вы получите три inputs: имя продукта, цену (как string для преобразования в число с плавающей точкой) и период warranty (как string для преобразования в целое число). Create ElectronicProduct с этими 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()

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

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

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

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