Почему ломается передача по ссылке в foreach с указанием оператора опциональной последовательности для массива?

Когда вы используете оператор опциональной последовательности (nullsafe operator - ?->) в цикле foreach в PHP для передачи значения по ссылке, вы можете столкнуться с проблемой, что передача по ссылке не работает должным образом.

Давайте рассмотрим простой пример:

$arr = [1, 2, 3];

foreach ($arr ?-> as &$value) {
    $value *= 2;
}

print_r($arr);

Ожидаемый результат: [2, 4, 6]

Однако, если вы попробуете выполнить этот код, вы можете заметить, что массив не изменился. Это происходит из-за того, что оператор опциональной последовательности возвращает null, если значение, на котором он вызывается, равно null, и в этом случае ссылка на $value теряет связь с элементом массива.

Чтобы избежать этой проблемы, вместо использования оператора опциональной последовательности в foreach, вам следует предварительно проверить массив на null и только после этого использовать foreach:

$arr = [1, 2, 3];

if ($arr !== null) {
    foreach ($arr as &$value) {
        $value *= 2;
    }
}

print_r($arr); 

Этот код будет работать ожидаемым образом и вы увидите массив [2, 4, 6].

Таким образом, когда используется оператор опциональной последовательности в foreach для передачи по ссылке, необходимо учитывать возможность null и корректно обрабатывать этот случай для правильной работы вашего кода.