Home » Программирование » Короткие заметки » Ограничение типа integer в PHP на уровне системы в Windows

Ограничение типа integer в PHP на уровне системы в Windows

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

$param = $id%100;

Код писался задолго до меня и предназначался для отделения от многозначного числа двух последних цифр. Каково же было моё удивление, когда для любого длинного ID этот остаток всегда был равен 47.

В ходе расследования выяснилось, что $id приходил в виде числовой строки, которая для деления по модулю неявно приводилась к целому числу. И вот тут-то и происходила подстава — вместо, например, «27384928757670» всегда получалось 2147483647, которое делилось на 100 с остатком 47.

Разгадка оказалась в том, что во всех PHP-версиях ниже 7.0 для Windows независимо от её разрядности максимальное значение типа integer ограничено 32-мя битами и в десятичной системе счисления составляет как раз 2147483647. В Linux оно настраивается параметром php_int_max и по умолчанию является 64-разрядным.

Это нужно иметь в виду при неявном приведении типов. Чтобы избавиться от этой мины замедленного действия, я просто заменил код на

$param = (int)substr($id, -2);

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Do NOT follow this link or you will be banned from the site!