Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Особенность PHP 7.2 (и 7.1)

Потихоньку смотрю как наш продукт запускается на ПХП версии 7.2 — у нас сейчас используется 7.0, но очень хочется двинуться дальше. В хитросплетениях кода нашёл очень странный баг интерпретатора, который был разбросан по разным строчкам кода, а в сконцентрированном виде он выглядит так:

$arr = [[1]];
array_walk($arr, function(){});
array_map('array_shift', $arr);
var_dump($arr);

В ПХП 7.0 массив выведется в неизменном виде, а в версии 7.2 (и 7.1, как оказалось) единица исчезнет. Очевидно, что array_walk создаёт какие-то ссылки внутри массива, из-за чего array_shift начинает получать внутренний массив по ссылке и сдвигать. Но никаким другим способом (например, прямым созданием массива со ссылками) мне такое поведение получить не удаётся.

5 комментариев
Пыщ Пыщ 2018

Ну да, array_walk() переделывает каждый элемент массива в ссылку — https://github.com/php/php-src/blob/a89eb2f101bf0ca6f92ee3160fa46de0bd6f31b8/ext/standard/array.c#L1405-L1406 но при этом забывает об обратной операции.

Евгений Степанищев 2018

Про баг я им написал, поправят уж, думаю.

Евгений Степанищев 2018

Интересно, что по коду видно, что array_walk умеет не только массив итерировать, но ещё и объект. С stdClass вполне себе работает.

Евгений Степанищев 2018
Alexey 2018

Мне во всей этой истории больше всего фамилия автора/коммитера понравилась.