类型 juggling 与类型转换
了解 PHP 如何自动在不同类型之间转换,以及如何手动进行类型转换。
类型 juggling 与类型转换 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
什么是类型转换
类型转换是指当运算符或函数需要不同类型时,PHP 会自动转换值的类型。
这很方便,但如果不了解其中的规则,可能会导致难以察觉的错误。
算术运算中的类型转换
PHP 在算术运算环境中使用字符串时,会将字符串转换为数字:
<?php
echo '5' + 3; // 8 — string '5' becomes int 5
echo '5.5' + 1.5; // 7 — string '5.5' becomes float
echo '5 cats' + 1; // 6 — leading numeric part used, rest ignored
echo 'cats' + 1; // 1 — non-numeric string becomes 0宽松比较 ==
== 运算符会在类型转换后比较值,这可能产生出人意料的结果:
<?php
var_dump(0 == 'a'); // true in PHP 7 (both become 0)
// false in PHP 8 (improved rules!)
var_dump('' == false); // true
var_dump('1' == true); // true
var_dump(null == false); // true严格比较 ===
请始终使用 === 同时比较值和类型,不会发生类型转换:
<?php
var_dump(1 === '1'); // false — different types
var_dump(1 === 1); // true
var_dump(null === false); // false
var_dump(0 === false); // false
// Rule of thumb: prefer === unless you explicitly need type coercion显式类型转换
在值前加上 (type),即可将其转换为指定类型:
<?php
$str = '42.7';
$int = (int) $str; // 42
$float = (float) $str; // 42.7
$bool = (bool) $str; // true
$arr = (array) $str; // ['42.7']
echo $int; // 42
echo $float; // 42.7settype() 函数
settype() 会原地更改变量的类型,并返回 true/false:
<?php
$value = '123';
settype($value, 'integer');
var_dump($value); // int(123)
// Alternative: intval(), floatval(), strval() functions
$n = intval('0xFF', 16); // 255 — parse hex string字符串转换为数字的边界情况
PHP 将字符串转换为数字时的主要规则:
- 忽略开头的空白字符:
' 42 '→ 42 - 非数字前缀:
'php8'→ 0(PHP 8 会发出通知) - 科学计数法:
'1e3'→ 1000.0 - 十六进制字符串:在 PHP 7 及更高版本中,
'0x1A'不会自动转换为 int
布尔类型转换规则
以下值会转换为 false;其他所有值都会转换为 true:
<?php
$falsy = [false, 0, 0.0, '', '0', [], null];
foreach ($falsy as $v) {
var_dump((bool) $v); // all bool(false)
}
// Careful:
var_dump((bool) '0'); // false — the STRING '0' is falsy!
var_dump((bool) '00'); // true — only exactly '0' is falsy带进制的 intval()
intval() 接受一个可选的进制参数,用于解析数字字符串:
<?php
echo intval('0b1010', 2); // 10 — binary
echo intval('077', 8); // 63 — octal
echo intval('1F', 16); // 31 — hexadecimal
echo intval('42'); // 42 — decimal (default base 10)PHP 8 改进了类型转换
PHP 8 修复了之前版本中一些不一致的类型转换行为:
0 == 'foo'现在为false(在 PHP 7 中曾为true)- 将数字与非数字字符串比较时,字符串不再被强制转换为 0
- 这让 PHP 8 更加安全,但依赖旧行为的旧代码可能会因此无法正常工作
避免类型转换问题
避免类型转换产生意外结果的最佳实践:
<?php
declare(strict_types=1); // enforce types at function boundaries
// Always use === for comparisons
if ($status === 'active') { /* safe */ }
// Cast explicitly before arithmetic
$total = (float) $_POST['price'] * (int) $_POST['qty'];
// Validate with filter_var
$age = filter_var($_POST['age'], FILTER_VALIDATE_INT);
if ($age === false) { /* invalid input */ }快速检查
在 PHP 中,(int) '42abc' 的计算结果是什么?
回顾:类型转换
您已经了解的 PHP 类型处理知识:
- PHP 会在运算中自动强制转换类型,这就是类型转换
==会在转换后比较;===是严格比较(类型 + 值)- 使用
(int)、(float)、(string)、(bool)进行显式转换 - 使用
intval()、floatval()、strval()作为函数式替代方案 - PHP 8 改进了一些类型转换的边界情况
- 启用
strict_types=1,减少代码中出现意外结果的情况
用 AI 导师学习 PHP — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 49
- 课程
- 195
常见问题解答
「类型 juggling 与类型转换」课时是免费的吗?
是的 — 「类型 juggling 与类型转换」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「类型 juggling 与类型转换」这节课中我会学到什么?
了解 PHP 如何自动在不同类型之间转换,以及如何手动进行类型转换。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「类型 juggling 与类型转换」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 在 PHP 中声明变量
- PHP 数据类型概览
- 使用 Echo 和 Print 输出
- 类型 juggling 与类型转换