Numeric strings

Оновлено: 11.05.2023

Рядок PHP вважається числовим, якщо його можна інтерпретувати як int або float.

Формально, починаючи з PHP 8.0.0:

У PHP також є поняття початкових числових рядків. Це просто рядок, який починається як числовий рядок, за яким слідують будь-які символи.

Зауважте:

Будь-який рядок, що містить літеру E (без урахування регістру), обмежений цифрами, буде сприйнято як число, виражене у науковій нотації. Це може призвести до неочікуваних результатів.

<?php
var_dump("0D1" == "000"); // false, "0D1" is not scientific notation
var_dump("0E1" == "000"); // true, "0E1" is 0 * (10 ^ 1), or 0
var_dump("2E1" == "020"); // true, "2E1" is 2 * (10 ^ 1), or 20
?>

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

  • Якщо рядок є числовим, перетворити до типу int, якщо рядок є цілим числовим рядком і не виходить за межі обмежень типу int (як визначено PHP_INT_MAX), інакше перетворити до типу float.
  • Якщо контекст дозволяє початкові числові рядки і рядок один, перетворити в int, якщо початкова частина рядка є цілим числовим рядком і не виходить за межі обмежень типу int (як визначено PHP_INT_MAX), інакше перетворити в число з плаваючою комою. Додатково видається помилка рівня E_WARNING.
  • Рядок не є числовим, згенерувати TypeError.

До версії PHP 8.0.0 рядок вважався числовим лише тоді, коли він мав початкові пробіли, якщо ж він мав кінцеві пробіли, то рядок вважався початковим числовим.

До версії PHP 8.0.0, коли рядок використовувався у числовому контексті, він виконував ті ж самі дії, що і вище, з наступними відмінностями:

  • Використання провідного числового рядка призведе до появи повідомлення E_NOTICE замість попередження E_WARNING.
  • Якщо рядок не є числовим, буде видано попередження E_WARNING і повернуто значення 0.

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "bob3";                // TypeError as of PHP 8.0.0, $foo is integer (1) previously
$foo = 1 + "10 Small Pigs";       // $foo is integer (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1;          // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
$foo = "10.0 pigs " + 1.0;        // $foo is float (11) and an E_WARNING is raised in PHP 8.0.0, E_NOTICE previously
?>