Menu
Coddy logo textTech

Продвижение конструктора (8.0)

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 42 из 91.

В PHP 8.0 появилась constructor promotion — функция, которая значительно сокращает шаблонный код при определении классов. Вместо того чтобы отдельно объявлять properties, а затем присваивать им значения в constructor, ты можешь сделать и то и другое за один шаг.

Вот традиционный подход, который вы использовали:

<?php
class Product {
    private string $name;
    private float $price;
    
    public function __construct(string $name, float $price) {
        $this->name = $name;
        $this->price = $price;
    }
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

При использовании constructor promotion вы добавляете модификатор доступа непосредственно к параметрам constructor:

<?php
class Product {
    public function __construct(
        private string $name,
        private float $price
    ) {}
    
    public function getInfo(): string {
        return $this->name . ": $" . $this->price;
    }
}

$product = new Product("Laptop", 999.99);
echo $product->getInfo();

Вывод:

Laptop: $999.99

Добавляя private, protected или public перед параметром конструктора, PHP автоматически создаёт свойство и присваивает ему значение. В одном и том же конструкторе можно сочетать promoted и обычные параметры, а при необходимости по-прежнему добавлять логику в тело конструктора.

Ключевой момент: promotion конструктора устраняет повторяющиеся объявления и присваивания свойств, делая ваши классы более чистыми и удобными для чтения, сохраняя при этом полный контроль над инкапсуляцией.

challenge icon

Задание

Легко

Давайте создадим систему управления контактами, демонстрирующую элегантность промоции конструктора. Вы создадите чистый современный класс PHP, который устраняет шаблонный код, сохраняя правильную инкапсуляцию.

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

  • Contact.php: создайте класс Contact, используя промоцию конструктора для определения всех properties непосредственно в сигнатуре конструктора. Ваш Contact должен иметь:
    • private property $name (string)
    • private property $email (string)
    • private property $phone (string) со значением по умолчанию "Not provided"
    Используйте синтаксис промоции конструктора: отдельные объявления properties не нужны! Add public method getFullDetails(), который возвращает "[name] | [email] | [phone]". Также Add method getSummary(), который возвращает "Contact: [name]".
  • main.php: подключите файл Contact. Вы получите три входных значения: имя, email и номер телефона. Создайте два экземпляра Contact:
    • first Contact должен использовать all three values (имя, email и телефон)
    • second Contact должен использовать only имя и email (полагаясь на значение телефона по умолчанию)
    Выведите четыре строки:
    • полные details первого Contact
    • summary первого Contact
    • полные details второго Contact
    • summary второго Contact

Обратите внимание, как промоция конструктора позволяет определить properties, задать их видимость, объявить их типы и присвоить им значения — всё в одной удобной для чтения сигнатуре конструктора. Необязательный параметр phone со значением по умолчанию демонстрирует, что promoted parameters без проблем работают со значениями по умолчанию, как и обычные parameters.

Попробуйте сами

<?php

require_once 'Contact.php';

// Прочитать ввод
$name = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$phone = trim(fgets(STDIN));

// TODO: Создать первый контакт со всеми тремя значениями (name, email, phone)

// TODO: Создать второй контакт только с name и email (использовать phone по умолчанию)

// TODO: Вывести полные данные первого контакта

// TODO: Вывести краткие данные первого контакта

// TODO: Вывести полные данные второго контакта

// TODO: Вывести краткие данные второго контакта

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

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

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

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