Menu
Coddy logo textTech

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

challenge icon

Задание

Легко

Давайте создадим систему каталога товаров, которая демонстрирует, как дочерние классы могут расширять функциональность родительских классов, используя ключевое слово 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()

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

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

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