Что выведет код Middle ООП, трейты и интерфейсы обновлено

clone и __clone

Вопрос

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

<?php
class Address { public function __construct(public string $city) {} }
class Person {
    public function __construct(public string $name, public Address $address) {}
}
class DeepPerson extends Person {
    public function __clone() { $this->address = clone $this->address; }
}
$a = new Person('Ира', new Address('Казань'));
$b = clone $a;
$b->name = 'Оля';
$b->address->city = 'Омск';
echo $a->name, ' ', $a->address->city, "\n";

$c = new DeepPerson('Ира', new Address('Казань'));
$d = clone $c;
$d->address->city = 'Омск';
echo $c->address->city, "\n";
var_dump($a == $b, $c == new DeepPerson('Ира', new Address('Казань')));

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

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

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

Коротко

Код выведет: Ира Омск, Казань, bool(false), bool(true). Поверхностный clone копирует строку name (своя у копии), но адрес общий: Ира Омск. clone в DeepPerson клонирует адрес, поэтому оригинал остаётся Казань. $a == $b ложно: имена разные.

Что выведет

Ира Омск
Казань
bool(false)
bool(true)

Разбор

Поверхностный clone копирует строку name (своя у копии), но адрес общий: Ира Омск. __clone в DeepPerson клонирует адрес, поэтому оригинал остаётся Казань. $a == $b ложно: имена разные. Последнее сравнение == идёт по классу и значениям свойств рекурсивно: true.

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

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