在 PHP 中,自动类型转换(隐式类型转换)是语言的核心特性之一,它会在运行时根据上下文自动将变量从一种类型转换为另一种类型。以下是主要的转换规则和常见场景:
1. 布尔型(boolean)转换
- 转为
false
的情况:
0
、0.0
、空字符串""
或"0"
、空数组[]
、null
、未定义的变量。 - 其他值:均转为
true
(包括非空字符串、非零数字、非空数组等)。
var_dump((bool) ""); // false
var_dump((bool) "false"); // true(非空字符串)
2. 整型(integer)转换
- 浮点数:向下取整(直接截断小数部分)。
var_dump((int) 3.8); // 3
- 布尔值:
true
→1
,false
→0
。 - 字符串:
- 以数字开头的字符串 → 截取到个非数字字符前的数字。
- 非数字开头 →
0
。
var_dump((int) "42 cats"); // 42 var_dump((int) "cats 42"); // 0
3. 浮点型(float/double)转换
- 整型、数字字符串 → 对应浮点数。
- 非数字字符串 →
0
。
var_dump((float) "3.14hello"); // 3.14
var_dump((float) "hello"); // 0
4. 字符串(string)转换
- 布尔值:
true
→"1"
,false
→""
(空字符串)。 - 数值:直接转为数字的字面字符串。
- 数组 →
"Array"
(并触发E_NOTICE
)。 - 对象 →
"__toString()"
方法的返回值(若未定义则报错)。 - null →
""
(空字符串)。
var_dump((string) true); // "1"
var_dump((string) [1, 2]); // "Array"(带警告)
5. 数组(array)转换
- 基本类型(如整型、字符串)→ 转为单元素数组
[0 => 原值]
。 null
→ 空数组[]
。
var_dump((array) "hello"); // [0 => "hello"]
var_dump((array) null); // []
6. 比较运算中的自动转换
PHP 在比较(==
、!=
)时会尝试类型转换,而严格比较(===
、!==
)则要求类型和值均相同。
- 松散比较(
==
)规则:- 字符串与数字 → 字符串转为数字后比较。
- 布尔值与其他类型 → 先将非布尔值转为布尔值再比较。
null
或false
与空数组 → 视为“空值”可能相等。
var_dump(0 == "0"); // true(字符串 "0" 转为数字 0)
var_dump(false == []); // false(规则复杂,实际不相等)
var_dump(null == ""); // false(注意:null 不等于空字符串)
7. 算术运算中的转换
- 操作数中若包含浮点数 → 其他操作数转为浮点数。
- 纯整型和字符串数字 → 转为整型(若字符串非数字则转为
0
)。
var_dump(1 + "2.5"); // 3.5(转为浮点)
var_dump("10" + "5"); // 15(转为整型)
var_dump("10" + "x"); // 10("x" 转为 0)
注意事项
- 精度问题:浮点数转换可能导致精度丢失(如
(int) (0.1 + 0.7)
结果为0
)。 - 预期外行为:如
"123abc" == 123
为true
,但"abc123" == 123
为false
。 - 严格模式:建议使用
===
和!==
避免隐式转换的副作用。
通过理解这些规则,可以避免因自动类型转换导致的逻辑错误,尤其在处理用户输入或数据库数据时需格外注意。