Продвижение конструктора (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 конструктора устраняет повторяющиеся объявления и присваивания свойств, делая ваши классы более чистыми и удобными для чтения, сохраняя при этом полный контроль над инкапсуляцией.
Задание
ЛегкоДавайте создадим систему управления контактами, демонстрирующую элегантность промоции конструктора. Вы создадите чистый современный класс PHP, который устраняет шаблонный код, сохраняя правильную инкапсуляцию.
Вы организуете код в двух файлах:
Contact.php: создайте классContact, используя промоцию конструктора для определения всех properties непосредственно в сигнатуре конструктора. Ваш Contact должен иметь:- private property
$name(string) - private property
$email(string) - private property
$phone(string) со значением по умолчанию"Not provided"
getFullDetails(), который возвращает"[name] | [email] | [phone]". Также Add methodgetSummary(), который возвращает"Contact: [name]".- private property
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: Вывести краткие данные второго контакта
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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