Особенность 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 начинает получать внутренний массив по ссылке и сдвигать. Но никаким другим способом (например, прямым созданием массива со ссылками) мне такое поведение получить не удаётся.
Ну да, array_walk() переделывает каждый элемент массива в ссылку — https://github.com/php/php-src/blob/a89eb2f101bf0ca6f92ee3160fa46de0bd6f31b8/ext/standard/array.c#L1405-L1406 но при этом забывает об обратной операции.
Про баг я им написал, поправят уж, думаю.
Интересно, что по коду видно, что array_walk умеет не только массив итерировать, но ещё и объект. С stdClass вполне себе работает.
Баг поправили
Мне во всей этой истории больше всего фамилия автора/коммитера понравилась.