Шило на мыло

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

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

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

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

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

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

Поделиться
Отправить
7 комментариев
hshhhhh.name

Зачем-то одно странное поведение заменили другим

Не смогли удержаться

Christian Archer

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

<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)

$s = ’abc’

=> «abc»

$s[1] = 2; $s

=> «a2c»

$s[10] = 3; $s

=> «a2c 3»
</code>

deadem

статическая типизация и PHP? может быть строгая типизация?

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

статическая типизация и PHP? может быть строгая типизация?

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

masterspammer

Интересно, но статическая нестрогая типизация вполне допускает расширение строки при записи в ещё несуществующую позицию.

masterspammer

Немного спасают неизменяемые строки; ну а назвать строку — $array — отдельная типовая ошибка.

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

Это сильно упрощённый код, чтобы суть показать. Там массив должен быть, но почему-то он проинициализирован строкой, как я и написал выше.

Популярное