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