Что выведет код 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 ошибок.
Ещё по теме «ООП, трейты и интерфейсы»
- Абстрактный класс или интерфейс в PHP
- Поверхностное клонирование
- Продвижение свойств в конструкторе
- Класс с интерфейсом и наследованием
- final и видимость констант
- Диспетчер событий с приоритетами
- Склад с исключениями предметной области
- Фигуры через интерфейс и абстрактный класс