PHP Conference Nagoya 2025

Числовые строки

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

<?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
?>

Строки в числовых контекстах

Когда строку необходимо использовать как число (например арифметические операции, декларация целочисленного типа, и т. д.), применяют следующий алгоритм действий:

  1. Если строка числовая, представляет целое число и не превышает максимально допустимого значения для типа int, которое опеределяет константа PHP_INT_MAX, то строка приводится к типу int. Иначе строка приводится к типу float.
  2. Если в заданном контексте разрешается использовать префиксную числовую строку, то, если начало строки представляет целое число и не превышает максимально допустимого значения для типа int, которое определяет константа PHP_INT_MAX, строка приводится к типу int. Иначе строка приводится к типу float. В таких случаях также выдаётся ошибка уровня E_WARNING.
  3. Если строка не числовая — выбрасывается исключение TypeError.

Поведение до PHP 8.0.0

До PHP 8.0.0 строка считалась числовой, только если она начиналась с пробельных символов. Если строка завершалась пробельными символами — PHP считал строку префиксной числовой.

До PHP 8.0.0, когда строку требовалось использовать как число, применялся приведённый алгоритм, но с рядом отличий:

  • Использование префиксной числовой строки вызывало ошибку уровня E_NOTICE, а не E_WARNING.
  • Если строка не была числовой, вызывалась ошибка уровня E_WARNING, а сама строка приводилась к числу 0.
До PHP 7.1.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

?>
Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top