Вы действительно должны убедиться, что вы печатаете то, что имеете в виду:
$bigint = 9999999999999999999;
Это не целое число PHP, а число с плавающей запятой:
float(1.0E+19)
Если бы вы сделали
$bigint = (int) 9999999999999999999;
Вы бы на самом деле установили целое число, но это было бы не то число, которое вы могли ожидать:
int(-8446744073709551616)
Нет проблем превратить это в строку, как вы могли догадаться. Поэтому будьте осторожны, когда вы пишете числа в коде, что вы действительно пишете то, что имеете в виду.
Смотри эту строку еще раз:
$bigint = 9999999999999999999;
попытайтесь понять, что вы на самом деле написали. Это не целое число, потому что PHP превратит его в число с плавающей точкой. См. Пример # 4 Целочисленное переполнение в 64-битной системе на странице справочника integer .
Если вам нужна более высокая точность, проверьте GNU Multiple Precision , он может иметь то, что вы ищете. Однако это не изменит способ записи чисел в PHP:
$bigint = gmp_init("9999999999999999999");
$bigint_string = gmp_strval($bigint);
var_dump($bigint, $bigint_string);
Выход:
resource(4) of type (GMP integer)
string(19) "9999999999999999999"