Шило на мыло
Всё-таки я большой поклонник статической типизации в языках. Жаль, что ПХП она только-только начинает проникать.
Несколько лет назад, один из программистов написал в нашем продукте интересный код, который я сильно упростил, чтобы показать суть:
<?php
$array = '';
$array[PHP_INT_MAX] = 1;
Главное тут в том, что массив почему-то проинициализирован как строка.
Несмотря на эту странность, всё работало — ПХП на втором присваивании преобразовывал строку в массив. А какое-то время назад этот код стал валиться с нехваткой памяти. Я сегодня разбирался с этой ошибкой.
Оказалось, что в ПХП 7.1 и выше (мы недавно перешли с 7.0 на 7.2), преобразование в массив тут больше не происходит. Зачем-то одно странное поведение заменили другим — теперь в этом коде создаётся гигантская строка, состоящая из пробелов и в позицию PHP_INT_MAX записывается символ «единица». Вот память и кончается. ?
Не смогли удержаться
Поведение не новое, просто убрали приведение пустой строки к массиву и оно заработало так же как и в предыдущих весриях для непустых строк. В общем, даже если это и странность, то она тоже старая
<code>
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)
=> «abc»
=> «a2c»
=> «a2c 3»
</code>
статическая типизация и PHP? может быть строгая типизация?
Мне бы хотелось статической. Или вы про фразу «только-только начинает проникать»? Это я про HHVM, очень надеюсь, что в него и в «обычный» PHP перейдёт статическая типизация, всё-таки определённое влияние он оказывает.
Интересно, но статическая нестрогая типизация вполне допускает расширение строки при записи в ещё несуществующую позицию.
Немного спасают неизменяемые строки; ну а назвать строку — $array — отдельная типовая ошибка.
Это сильно упрощённый код, чтобы суть показать. Там массив должен быть, но почему-то он проинициализирован строкой, как я и написал выше.
Ха, меня удивил php < 7.1, кстати робот вашего блога часто считает мои комментарии спамом, а значит он требует доработки, конечно если вам нужны фидбеки.
Проблема, в том, что я использую чужой движок, а в нём есть ограничения на изменения. В тех рамках, в которых я имею право вносить изменения, до конца не удаётся антиспам починить.