Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Шило на мыло

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

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

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

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

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

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

9 комментариев
hshhhhh.name 2018

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

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

Christian Archer 2018

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

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

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

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

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

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

masterspammer 2018

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

masterspammer 2018

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

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

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

Николай Лебеденко 2019

Ха, меня удивил php < 7.1, кстати робот вашего блога часто считает мои комментарии спамом, а значит он требует доработки, конечно если вам нужны фидбеки.

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

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