Что выведет код Middle Массивы изнутри спрашивают часто обновлено

Массивы по значению, объекты по дескриптору

Вопрос

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

<?php
function addItem(array $list, object $box): void {
    $list[] = 'new';
    $box->items[] = 'new';
}
$list = ['a'];
$box = new stdClass();
$box->items = ['a'];
addItem($list, $box);
echo count($list), ' ', count($box->items), "\n";
$copy = $box;
$copy->items = [];
echo count($box->items), "\n";

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

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

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

Коротко

Код выведет: 1 2, 0. Массив передаётся по значению: функция изменила свою копию, у вызывающего остался 1 элемент.

Что выведет

1 2
0

Разбор

Массив передаётся по значению: функция изменила свою копию, у вызывающего остался 1 элемент. Объект передаётся как дескриптор, и функция меняет тот же объект: 2. Присваивание $copy = $box тоже копирует дескриптор, поэтому очистка $copy->items видна через $box: 0. Для копии объекта нужен clone.

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

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