Свойства Readonly (PHP 8.1)
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 19 из 91.
В PHP 8.1 появились свойства readonly, которым можно присвоить значение только один раз и которые нельзя изменить впоследствии. В отличие от констант, свойства readonly задаются во время инициализации объекта, а не во время определения class.
Вы объявляете свойство readonly, добавляя ключевое слово readonly перед объявлением типа:
<?php
class User {
public readonly string $id;
public readonly string $name;
public function __construct(string $id, string $name) {
$this->id = $id;
$this->name = $name;
}
}
$user = new User("U001", "Alice");
echo $user->id . "\n";
echo $user->name;
Вывод:
U001
AliceПосле присваивания попытка изменить свойство readonly вызовет ошибку. Это делает такие свойства идеальными для значений, которые должны оставаться постоянными на протяжении всего жизненного цикла object, например идентификаторов или временных меток создания.
readonly properties должны иметь объявление типа и могут быть присвоены только один раз — внутри объявляющего их class (обычно в constructor). В отличие от обычных properties, им нельзя задать значение по умолчанию при объявлении. Они работают с любым модификатором видимости:
<?php
class Product {
public function __construct(
public readonly string $sku,
private readonly float $cost
) {}
public function getCost(): float {
return $this->cost;
}
}
$product = new Product("ABC123", 29.99);
echo $product->sku;
Вывод:
ABC123Ключевой момент: readonly properties обеспечивают неизменяемость на уровне property. Они идеально подходят для данных, которые идентифицируют object или не должны изменяться после создания, сочетая гибкость инициализации во время выполнения с защитой от случайных изменений.
Задание
ЛегкоДавайте создадим неизменяемую систему конфигурации, использующую readonly properties, чтобы гарантировать, что критически важные настройки нельзя будет случайно изменить после инициализации.
Вы создадите два файла, которые будут работать вместе для управления конфигурацией приложения:
Config.php: Определите классConfig, представляющий конфигурацию приложения с неизменяемыми настройками. У класса должно быть три public readonly properties:string $appName,string $versionиint $maxConnections. Используйте constructor promotion, чтобы объявить и инициализировать все три readonly properties в одном лаконичном определении конструктора. Добавьте методgetInfo(), который возвращает string в формате"[appName] v[version] (max: [maxConnections] connections)".main.php: Подключите файл класса Config. Вы получите три входных значения: имя app, версию и максимальное количество подключений (как string, которую необходимо преобразовать в целое число). Создайте объектConfig, используя эти values. Выведите результат методаgetInfo()в первой строке. Затем выведите каждое readonly property в отдельной строке, обращаясь к ним напрямую: имя app, версию и max connections.
readonly properties гарантируют, что после создания конфигурации её значения останутся неизменными, что идеально подходит для настроек, которые должны сохраняться постоянными на протяжении всего времени работы вашего приложения. Обратите внимание, как сочетание constructor promotion и readonly позволяет очень лаконично определить неизменяемые объекты-значения.
Ваш вывод должен содержать formatted info string, за которой следует значение каждого отдельного property, демонстрируя, что readonly properties по-прежнему можно читать за пределами класса.
REQUIRED OUTPUT FORMAT:Попробуйте сами
<?php
require_once 'Config.php';
// Чтение входных данных
$appName = trim(fgets(STDIN));
$version = trim(fgets(STDIN));
$maxConnections = intval(trim(fgets(STDIN)));
// TODO: Создайте объект Config, используя входные значения
// TODO: Выведите результат getInfo()
// TODO: Выведите каждое свойство только для чтения на отдельной строке:
// - имя приложения
// - версия
// - макс. соединений
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP