Шило на мыло

Всё-таки я большой поклонник статической типизации в языках. Жаль, что ПХП она только-только начинает проникать.

Несколько лет назад, один из программистов написал в нашем продукте интересный код, который я сильно упростил, чтобы показать суть:

<?php
$array = '';
$array[PHP_INT_MAX] = 1;

Главное тут в том, что массив почему-то проинициализирован как строка.

Несмотря на эту странность, всё работало — ПХП на втором присваивании преобразовывал строку в массив. А какое-то время назад этот код стал валиться с нехваткой памяти. Я сегодня разбирался с этой ошибкой.

Оказалось, что в ПХП 7.1 и выше (мы недавно перешли с 7.0 на 7.2), преобразование в массив тут больше не происходит. Зачем-то одно странное поведение заменили другим — теперь в этом коде создаётся гигантская строка, состоящая из пробелов и в позицию PHP_INT_MAX записывается символ «единица». Вот память и кончается. ?

Читайте также

Дочка пошла в школу
В этом году дочке исполнилось шесть и она пошла в школу, пока в нулевой класс. К садику, куда она ходила, накопилась много претензий, задумались менять.
2022
Особенность PHP 7.2 (и 7.1)
Потихоньку смотрю как наш продукт запускается на ПХП версии 7.2 — у нас сейчас используется 7.0, но очень хочется двинуться дальше. В хитросплетениях кода нашёл очень странный баг интерпретатора, который был разбросан по разным строчкам кода, а в сконцентрированном виде он выглядит так:
2018
Первый язык программирования высокого уровня — Планкалкюль
Планкалкюль (Plankalkül) — первый в мире язык программирования высокого уровня, разработанный немецким инженером Конрадом Цузе между 1942 и 1946 годами для его компьютера «Z4».
2011

Комментарии 9

Christian Archer № 2

Поведение не новое, просто убрали приведение пустой строки к массиву и оно заработало так же как и в предыдущих весриях для непустых строк. В общем, даже если это и странность, то она тоже старая

Psy Shell v0.8.16 (PHP 5.6.37 — cli) by Justin Hileman
New version is available (current: v0.8.16, latest: v0.9.6)

>> $s = 'abc'

=> «abc»

>> $s[1] = 2; $s

=> «a2c»

>> $s[10] = 3; $s

=> «a2c 3»

Евгений Степанищев автор № 4
статическая типизация и PHP? может быть строгая типизация?

Мне бы хотелось статической. Или вы про фразу «только-только начинает проникать»? Это я про HHVM, очень надеюсь, что в него и в «обычный» PHP перейдёт статическая типизация, всё-таки определённое влияние он оказывает.

masterspammer № 5
Интересно, но статическая нестрогая типизация вполне допускает расширение строки при записи в ещё несуществующую позицию.
Евгений Степанищев автор № 7
Это сильно упрощённый код, чтобы суть показать. Там массив должен быть, но почему-то он проинициализирован строкой, как я и написал выше.
Николай Лебеденко № 8
Ха, меня удивил php < 7.1, кстати робот вашего блога часто считает мои комментарии спамом, а значит он требует доработки, конечно если вам нужны фидбеки.
Евгений Степанищев автор № 9
Проблема, в том, что я использую чужой движок, а в нём есть ограничения на изменения. В тех рамках, в которых я имею право вносить изменения, до конца не удаётся антиспам починить.