값을 다른 타입으로 변환하려면 값 앞에 괄호로 타입을 씁니다: (int) "42"는 정수 42가 됩니다. 함수 형태인 intval("42")도 같은 일을 합니다. 캐스트는 절대 실패하지 않습니다. 숫자가 아닌 텍스트는 0이 되고, 숫자로 시작하는 문자열은 그 숫자만 남습니다.
PHP의 캐스트는 (int), (float), (string), (bool), (array), (object)입니다. 각각 함수도 있습니다: intval(), floatval(), strval(), boolval().
문자열을 int로: (int)와 intval()이 반환하는 값
PHP는 앞쪽 공백을 건너뛴 뒤 문자열 처음부터 숫자를 읽고, 숫자에 맞지 않는 첫 문자에서 멈춥니다. 지수 표기는 숫자로 인정되지만 0x 접두사는 아닙니다.
"12.7"이 12가 되는 점에 주의하세요. int로 캐스트하면 소수 부분이 잘리며, 반올림되지 않습니다. 입력이 무엇이든 (int)와 intval()은 여기서 경고를 출력하지 않습니다.
진법을 지정한 intval()
intval($value, $base)는 문자열을 다른 진법으로 읽습니다. 진법이 0이면 PHP는 접두사를 봅니다: 16진수는 0x, 2진수는 0b, 8진수는 앞자리 0입니다.
float를 int로: 반올림이 아니라 버림
(int)는 소수점 이하를 0 방향으로 모두 버립니다. 가장 가까운 정수를 원하면 먼저 반올림하고, 괄호에 주의하세요.
마지막 쌍은 대표적인 float 함정입니다. (0.1 + 0.7) * 10은 7.999999...로 저장되므로 버리면 7이 됩니다. 먼저 반올림하면 8이 됩니다. round, floor, ceil은 수학 페이지에서 다룹니다.
bool, string, array로 캐스트
bool로 변환하면 몇 안 되는 값만 false가 됩니다: 0, 0.0, "", "0", null, []. 나머지는 모두 true이며, "0.0", " ", "false"도 포함됩니다.
string으로 변환하면 true는 "1"이 되고, false와 null은 모두 ""이 됩니다. float는 끝의 .0을 버리고, 아주 크거나 작은 float는 지수 표기를 씁니다.
배열을 문자열로 캐스트해도 이어 붙여지지 않습니다. 이 코드는 Tags: Array를 출력합니다.
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
그리고 PHP는 경고를 추가합니다.
Warning: Array to string conversion in /home/index.php on line 3
배열을 텍스트로 바꾸려면 implode(", ", $array)나 json_encode($array)를 쓰세요.
모든 캐스트 한눈에 보기
값을 골라 intval, (bool), strval, is_numeric, gettype이 무엇을 반환하는지 확인하세요. 모든 칸은 PHP 8.3이 계산했습니다.
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
숫자 형태 문자열과 자동 변환
숫자 형태 문자열은 "12", "-3.5", "1e3"처럼 숫자로 보이는 문자열이며, 앞뒤에 공백이 있어도 됩니다. PHP는 산술에서 이들을 자동으로 변환하고, is_numeric()은 문자열이 해당하는지 알려 줍니다.
"12abc" + 1은 여전히 13이지만 PHP 8은 Warning: A non-numeric value encountered를 출력하고, "abc" + 1은 TypeError를 던집니다. 사용자 입력으로 산술을 하기 전에 캐스트하거나 검증하세요.
settype()과 gettype()
settype()은 변수의 타입을 그 자리에서 바꾸고, gettype()은 타입을 알려 줍니다. get_debug_type()은 에러 메시지에서 보는 짧은 이름(int, float, string)을 반환합니다.
대부분의 코드는 더 짧고 똑같이 읽히는 캐스트($value = (int) $value;)를 씁니다.
캐스트하지 말고 입력을 검증하기
(int)는 절대 거부하지 않으므로 (int) "abc"는 조용히 0이 되고 (int) "5 apples"는 5가 됩니다. 폼 입력에는 FILTER_VALIDATE_INT와 함께 filter_var를 쓰세요. 정수나 false를 반환합니다.
0은 유효한 정수이고 == false는 그것을 거부하므로, 결과는 === false로 비교하세요. 범위와 다른 검증기는 filter_var 페이지에 있습니다.
자주 묻는 질문
PHP에서 문자열을 int로 변환하려면 어떻게 하나요?
(int) $str나 intval($str)를 쓰세요. 10진수에서는 둘의 결과가 같습니다. (int) "42"는 42, (int) "12abc"는 12, (int) "abc"는 0입니다. 정수가 아닌 입력을 거부하려면 추측하는 대신 false를 반환하는 filter_var($str, FILTER_VALIDATE_INT)를 쓰세요.
PHP에서 intval()과 (int)의 차이는 무엇인가요?
10진수에서는 같은 결과를 반환합니다. intval()은 진법도 받습니다: intval('ff', 16)은 255이고, 진법을 0으로 주면 0x, 0b, 8진수를 뜻하는 앞자리 0 같은 접두사를 읽습니다. 함수이므로 array_map('intval', $values)처럼 콜백으로 넘길 수도 있습니다.
PHP에서 (bool) "0"은 무엇을 반환하나요?
false입니다. 문자열 "0"은 "", 0, 0.0, null, []와 함께 PHP에서 거짓으로 평가되는 값입니다. 그 밖의 모든 문자열은 true이며, "0.0", " ", "false"도 포함됩니다.
PHP에서 숫자를 문자열로 변환하려면 어떻게 하나요?
(string) $n, strval($n)을 쓰거나 문자열 안에 넣으세요: "$n". (string) 3.0은 "3"입니다. 소수 자릿수를 고정하려면 number_format($n, 2)나 sprintf('%.2f', $n)를 쓰세요.