У меня следующая ошибка при запуске этого кода ниже:
Код:
<?php
$a = array(00001, 00008, 00009, 00012);
print_r($a);
?>
Ошибка:
Ошибка разбора: неверный числовой литерал.
Почему возникла эта проблема и как мне ее решить?
Это происходит из-за изменений, внесенных в то, как целые числа, особенно восьмеричные, обрабатываются в PHP7 (в отличие от PHP5).
Из документации (из миграции на PHP7)
Неверные восьмеричные литералы
Ранее восьмеричные восьмеричные литералы, которые содержали недопустимые числа, были молча усечены (0128 было взято как 012). Теперь неверный восьмеричный литерал вызовет ошибку разбора.
Из документации целых чисел
До PHP 7, если неверное число было задано в восьмеричном целом числе (то есть 8 или 9), оставшаяся часть была проигнорирована. Начиная с PHP 7, возникает ошибка синтаксического анализа.
Используйте их как строки или как целые числа
$a = array(1, 8, 9, 12); // Integers
$a = array("00001", "00008", "00009", "00012"); // Strings
Это связано с тем, что все числа, начинающиеся с 0, считаются восьмеричными значениями, верхний предел которых составляет 8 цифр на позицию (0-7). Как указано в руководстве по PHP, вместо того чтобы молча сбросить недействительные цифры, они теперь (7.x) выдают вышеупомянутое предупреждение.
Почему ты так пишешь свои цифры? Если начальные нули значимы, то это не число, которое у вас есть, а строка. Если вам нужно выполнить вычисления для них, как если бы они были числами, вам нужно добавить начальные нули при выводе значений на клиент.
Это может быть сделано с printf()
или же sprintf()
как это:
$number = 5;
printf ("%05$1d", $number);
пожалуйста см. руководство для большего количества примеров.
Иногда явно допустимый числовой литерал обнаруживается как недопустимый числовой литерал.
Это регрессия с php5.4
Вы можете исправить это, изменив массив на:
$a =array(1,8,9,12);
$a = array('0001','0008','0009','0012'); //alternative method for fix