Выбор ответа Senior PHP 8.x: enum, readonly, match обновлено
readonly и метод with
Вопрос
Как правильно реализовать метод withEmail() у final readonly class User, возвращающий изменённую копию, в PHP 8.3?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Создать новый объект через конструктор с изменённым значением. Запись в readonly-свойство клона вне clone запрещена, так что вариант с clone и присваиванием снаружи бросит Error.
Варианты ответа
clone $this, затем присвоить$copy->emailснаружи__clone- Создать новый объект через конструктор с изменённым значениемправильный ответ
- Снять
readonlyчерез рефлексию и записать новое значение - Изменить
$this->emailнапрямую и вернуть$this
Разбор
Запись в readonly-свойство клона вне __clone запрещена, так что вариант с clone и присваиванием снаружи бросит Error. Надёжный путь: return new self($this->name, $email);. В PHP 8.3 разрешили переинициализировать readonly-свойства внутри __clone, что помогает с глубоким копированием. Рефлексия ради обхода неизменяемости и мутация $this ломают саму идею.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.