숫자 문자열(Numeric strings)
PHP 문자열은 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에는 선행 숫자 문자열이라는 개념도 있습니다. 이것은 단순히 숫자 문자열처럼 시작하고 그 뒤에 임의의 문자가 오는 문자열입니다.
숫자 컨텍스트에서 사용되는 문자열
문자열을 숫자로 평가해야 하는 경우(예: 산술 연산, int 유형 선언 등) 다음 단계를 수행하여 결과를 결정합니다.
- 문자열이 숫자인 경우 문자열이 정수 숫자 문자열이고 int 유형 제한(
PHP_INT_MAX
에 정의됨)의 한계에 맞는 경우 int로 해석하고, 그렇지 않으면 float로 해석합니다. - 컨텍스트가 선행 숫자 문자열을 허용하고 문자열이 하나인 경우 문자열의 선행 부분이 정수 숫자 문자열이고 int 유형 제한(
PHP_INT_MAX
에 정의된 대로)의 제한에 맞는 경우 int로 해석하고, 그렇지 않으면 뜨다. 또한E_WARNING
레벨의 오류가 발생합니다. - 문자열이 숫자가 아닙니다. TypeError가 발생합니다.
PHP 8.0.0 이전의 동작
PHP 8.0.0 이전에는 문자열이 선행 공백이 있는 경우에만 숫자로 간주되었고, 후행 공백이 있는 경우 문자열은 선행 숫자로 간주되었습니다.
PHP 8.0.0 이전에는 숫자 컨텍스트에서 문자열을 사용할 때 다음과 같은 차이점을 제외하고 위와 동일한 단계를 수행했습니다.
- 선행 숫자 문자열을 사용하면
E_WARNING
대신E_NOTICE
가 발생합니다. - 문자열이 숫자가 아니면
E_WARNING
이 발생하고 값 0이 반환됩니다.
PHP 7.1.0 이전에는 E_NOTICE
나 E_WARNING
이 발생하지 않았습니다.
<?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
?>