PHP Academy · 课时

类型 juggling 与类型转换

了解 PHP 如何自动在不同类型之间转换,以及如何手动进行类型转换。

第 4 / 4 课13 个步骤

类型 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.7

settype() 函数

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 在 PHP 中声明变量
  2. PHP 数据类型概览
  3. 使用 Echo 和 Print 输出
  4. 类型 juggling 与类型转换
← 返回 PHP Academy