Выбор ответа Senior PHP 8.x: enum, readonly, match обновлено

readonly и метод with

Вопрос

Как правильно реализовать метод withEmail() у final readonly class User, возвращающий изменённую копию, в PHP 8.3?

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

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Создать новый объект через конструктор с изменённым значением. Запись в readonly-свойство клона вне clone запрещена, так что вариант с clone и присваиванием снаружи бросит Error.

Варианты ответа

  1. clone $this, затем присвоить $copy->email снаружи __clone
  2. Создать новый объект через конструктор с изменённым значениемправильный ответ
  3. Снять readonly через рефлексию и записать новое значение
  4. Изменить $this->email напрямую и вернуть $this

Разбор

Запись в readonly-свойство клона вне __clone запрещена, так что вариант с clone и присваиванием снаружи бросит Error. Надёжный путь: return new self($this->name, $email);. В PHP 8.3 разрешили переинициализировать readonly-свойства внутри __clone, что помогает с глубоким копированием. Рефлексия ради обхода неизменяемости и мутация $this ломают саму идею.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме