要把一个值转换成另一种类型,在它前面用括号写上类型:(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 会看前缀:0x 表示十六进制,0b 表示二进制,开头的 0 表示八进制。下面的每个结果都可以用进制转换器核对。
float 转 int:截断,而不是四舍五入
(int) 会向零方向丢掉小数点后的所有内容。想得到最接近的整数,就先取整,并注意括号的位置:
最后两行是经典的浮点数陷阱:(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 都变成 ""。浮点数会去掉末尾的 .0,非常大或非常小的浮点数会使用指数写法。
把数组转换成字符串并不会把元素拼接起来。下面的代码输出 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。
用 === false 比较结果,因为 0 是合法的整数,用 == false 会把它也拒绝掉。filter_var 页面介绍了取值范围和其他校验器。
常见问题
PHP 中怎么把字符串转成 int?
用 (int) $str 或 intval($str),在十进制下两者结果相同。(int) "42" 是 42,(int) "12abc" 是 12,(int) "abc" 是 0。如果要拒绝不是整数的输入,用 filter_var($str, FILTER_VALIDATE_INT),它会返回 false,而不是去猜。
PHP 中 intval() 和 (int) 有什么区别?
在十进制下两者返回相同的结果。intval() 还可以传入进制:intval('ff', 16) 是 255;进制为 0 时,它会识别 0x、0b 这样的前缀,以及表示八进制的开头 0。intval 是函数,所以还能作为回调传入,例如 array_map('intval', $values)。
PHP 中 (bool) "0" 返回什么?
false。字符串 "0" 是 PHP 的假值之一,其他假值还有 ""、0、0.0、null 和 []。其余所有字符串都是 true,包括 "0.0"、" " 和 "false"。
PHP 中怎么把数字转成字符串?
用 (string) $n、strval($n),或者直接放进字符串:"$n"。(string) 3.0 是 "3";如果要固定小数位数,用 number_format($n, 2) 或 sprintf('%.2f', $n)。