Совсем недавно столкнулся с неработоспособностью кода у себя на локальной машине для разработки при всём том, что на боевом сервере он работал как надо. В нём выполнялось деление некоего 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);