Что выведет код Middle PHP 8.x: enum, readonly, match обновлено

readonly и вложенные объекты

Вопрос

Что выведет скрипт (PHP 8.3)? По строке на каждый вывод.

<?php
final class Money {
    public function __construct(
        public readonly int $amount,
        public readonly ArrayObject $tags,
    ) {}
}
$m = new Money(100, new ArrayObject(['a']));
$m->tags[] = 'b';
echo count($m->tags), "\n";
try {
    $m->amount = 200;
} catch (Error $e) {
    echo $e->getMessage(), "\n";
}
echo $m->amount, "\n";

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

Напишите, что выведет код: каждый вывод с новой строки.

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

Коротко

Код выведет: 2, Cannot modify readonly property Money::$amount, 100. readonly защищает только само свойство: присвоить ему другой объект нельзя, но менять внутреннее состояние объекта ArrayObject можно: 2 элемента.

Что выведет

2
Cannot modify readonly property Money::$amount
100

Разбор

readonly защищает только само свойство: присвоить ему другой объект нельзя, но менять внутреннее состояние объекта ArrayObject можно: 2 элемента. Запись в amount бросает Error с сообщением Cannot modify readonly property Money::$amount.

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

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

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