you should to add example without whitespaces:
$foo = 4 + "10.2LittlePiggies";
PHP считает строку (string) числовой, если строку возможно интерпретировать как целое число (int) или как число с плавающей точкой (float).
Формально с PHP 8.0.0:
WHITESPACES \s* LNUM [0-9]+ DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM}) INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES} FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES} NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
В PHP также поддерживается концепция префиксной числовой строки. Это строка, которая начинается как числовая и продолжается любыми другими символами.
Замечание:
Строка, которая содержит букву
E
(без учёта регистра), ограниченную цифрами, воспринимается как число, которое выразили в научной нотации. Поведение при сравнении строк с числами в научной нотации иногда кажется неожиданным.Пример #1 Сравнение строк с числами в научной нотации
<?php
var_dump("0D1" == "000"); // false, "0D1" — не научная нотация
var_dump("0E1" == "000"); // true, "0E1" интерпретируется как выражение 0 * (10 ^ 1), которое равно значению 0
var_dump("2E1" == "020"); // true, "2E1" интерпретируется как выражение 2 * (10 ^ 1), которое равно значению 20
?>
Когда строку необходимо использовать как число (например арифметические операции, декларация целочисленного типа, и т. д.), применяют следующий алгоритм действий:
PHP_INT_MAX
, иначе строка приводится к типу float.
PHP_INT_MAX
,
которая определяет в PHP наибольшее значение для типа int,
иначе строка разрешается
в тип float и дополнительно выдаёт ошибку
уровня E_WARNING
.
До PHP 8.0.0 строка считалась числовой, только если она начиналась с пробельных символов. PHP считал строку префиксной числовой, если строка завершалась пробельными символами.
До PHP 8.0.0 при работе со строкой как с числом применялся приведённый алгоритм, но с рядом отличий:
E_NOTICE
, а не E_WARNING
.
E_WARNING
,
а сама строка приводилась к числу 0
.
E_NOTICE
,
ни уровня E_WARNING
.
<?php
$foo = 1 + "10.5"; // Переменная $foo — число с плавающей точкой (11.5)
$foo = 1 + "-1.3e3"; // Переменная $foo — число с плавающей точкой (-1299)
$foo = 1 + "bob-1.3e3"; // TypeError начиная с PHP 8.0.0. Ранее $foo принималось за целое число (1)
$foo = 1 + "bob3"; // TypeError начиная с PHP 8.0.0, Ранее $foo принималось за целое число (1)
$foo = 1 + "10 Small Pigs"; // Переменная $foo — целое (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // Переменная $foo — число с плавающей точкой (14.2). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = "10.0 pigs " + 1; // Переменная $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = "10.0 pigs " + 1.0; // Переменная $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
?>
you should to add example without whitespaces:
$foo = 4 + "10.2LittlePiggies";