Skip to content

4.5 类型判断与类型转换

在 PHP 中,类型判断和类型转换是常见的操作。本文将介绍如何判断变量类型以及如何在不同类型之间进行转换。

1. 类型判断

1.1 类型判断函数

PHP 提供了一系列函数来判断变量的类型:

函数描述
is_int()检查变量是否为整数
is_float()检查变量是否为浮点数
is_bool()检查变量是否为布尔值
is_string()检查变量是否为字符串
is_array()检查变量是否为数组
is_object()检查变量是否为对象
is_null()检查变量是否为 NULL
is_resource()检查变量是否为资源
is_callable()检查变量是否为可调用
is_scalar()检查变量是否为标量类型
is_numeric()检查变量是否为数字或数字字符串
is_iterable()检查变量是否为可迭代
gettype()获取变量的类型
get_debug_type()获取变量的详细类型(PHP 7.3+)

1.2 示例:类型判断

php
$var = 123;

echo "变量值: $var<br>";
echo "类型: " . gettype($var) . "<br>";
echo "是否为整数: " . (is_int($var) ? "是" : "否") . "<br>";
echo "是否为浮点数: " . (is_float($var) ? "是" : "否") . "<br>";
echo "是否为字符串: " . (is_string($var) ? "是" : "否") . "<br>";
echo "是否为数组: " . (is_array($var) ? "是" : "否") . "<br>";
echo "是否为对象: " . (is_object($var) ? "是" : "否") . "<br>";
echo "是否为 null: " . (is_null($var) ? "是" : "否") . "<br>";
echo "是否为标量: " . (is_scalar($var) ? "是" : "否") . "<br>";
echo "是否为数字: " . (is_numeric($var) ? "是" : "否") . "<br>";

1.3 严格类型比较

使用 ===!== 运算符可以进行严格类型比较:

php
$a = 123;
$b = "123";

echo "$a == $b: " . ($a == $b ? "相等" : "不相等") . "<br>";
// 输出: 123 == 123: 相等

echo "$a === $b: " . ($a === $b ? "相等" : "不相等") . "<br>";
// 输出: 123 === 123: 不相等

2. 类型转换

2.1 自动类型转换

PHP 会根据上下文自动转换类型:

php
// 字符串转整数
$str = "123";
$int = $str + 0; // 123

echo "类型: " . gettype($int) . "<br>";

// 整数转字符串
$int = 123;
$str = "" . $int; // "123"

echo "类型: " . gettype($str) . "<br>";

// 浮点数转整数
$float = 123.45;
$int = (int) $float; // 123

echo "类型: " . gettype($int) . "<br>";

// 布尔值转整数
$bool = true;
$int = $bool; // 1

echo "类型: " . gettype($int) . "<br>";

$bool = false;
$int = $bool; // 0

echo "类型: " . gettype($int) . "<br>";

2.2 强制类型转换

使用类型转换操作符可以强制转换类型:

php
// 转换为整数
$int = (int) "123.45"; // 123
$int = (integer) "123.45"; // 123

// 转换为浮点数
$float = (float) "123"; // 123.0
$float = (double) "123"; // 123.0
$float = (real) "123"; // 123.0

// 转换为字符串
$str = (string) 123; // "123"

// 转换为布尔值
$bool = (bool) "" ; // false
$bool = (boolean) "hello"; // true

// 转换为数组
$arr = (array) $object; // 将对象转换为数组

// 转换为对象
$obj = (object) $array; // 将数组转换为对象

// 转换为 NULL
$null = (unset) $var; // 将变量设置为 NULL

2.3 函数转换

使用函数进行类型转换:

php
// 转换为整数
$int = intval("123.45"); // 123
$int = (int) "123.45"; // 123

// 转换为浮点数
$float = floatval("123.45"); // 123.45
$float = (float) "123.45"; // 123.45

// 转换为字符串
$str = strval(123); // "123"
$str = (string) 123; // "123"

// 转换为布尔值
$bool = boolval("hello"); // true
$bool = (bool) "hello"; // true

// 转换为数组
$arr = (array) $object;

// 转换为对象
$obj = (object) $array;

3. 类型转换规则

3.1 字符串转数字

  • 字符串以数字开头,转换为相应的数字
  • 字符串不以数字开头,转换为 0
  • 空字符串转换为 0
php
$var1 = "123";
echo (int) $var1; // 123

$var2 = "123abc";
echo (int) $var2; // 123

$var3 = "abc123";
echo (int) $var3; // 0

$var4 = "";
echo (int) $var4; // 0

$var5 = "0";
echo (int) $var5; // 0

$var6 = "123.45";
echo (float) $var6; // 123.45

3.2 数字转字符串

  • 整数转换为相应的字符串
  • 浮点数转换为相应的字符串
php
$var1 = 123;
echo (string) $var1; // "123"

$var2 = 123.45;
echo (string) $var2; // "123.45"

$var3 = 0;
echo (string) $var3; // "0"

3.3 布尔值转换

转换为布尔值

以下值转换为 false

  • false
  • 0(整数)
  • 0.0(浮点数)
  • ""(空字符串)
  • "0"(字符串 "0")
  • null
  • array()(空数组)

其他值转换为 true

php
$var1 = 0;
echo (bool) $var1 ? "true" : "false"; // false

$var2 = "";
echo (bool) $var2 ? "true" : "false"; // false

$var3 = "0";
echo (bool) $var3 ? "true" : "false"; // false

$var4 = null;
echo (bool) $var4 ? "true" : "false"; // false

$var5 = array();
echo (bool) $var5 ? "true" : "false"; // false

$var6 = "hello";
echo (bool) $var6 ? "true" : "false"; // true

$var7 = 123;
echo (bool) $var7 ? "true" : "false"; // true

$var8 = array(1);
echo (bool) $var8 ? "true" : "false"; // true

布尔值转其他类型

  • true 转换为 1(整数)、1.0(浮点数)、"1"(字符串)
  • false 转换为 0(整数)、0.0(浮点数)、""(字符串)
php
$var1 = true;
echo (int) $var1; // 1
echo (float) $var1; // 1.0
echo (string) $var1; // "1"

$var2 = false;
echo (int) $var2; // 0
echo (float) $var2; // 0.0
echo (string) $var2; // ""

3.4 NULL 转换

  • null 转换为 0(整数)、0.0(浮点数)、""(字符串)、false(布尔值)
php
$var = null;
echo (int) $var; // 0
echo (float) $var; // 0.0
echo (string) $var; // ""
echo (bool) $var ? "true" : "false"; // false

3.5 数组转换

  • 数组转换为布尔值:空数组转换为 false,非空数组转换为 true
  • 数组转换为字符串:总是转换为 "Array"
php
$var1 = array();
echo (bool) $var1 ? "true" : "false"; // false
echo (string) $var1; // "Array"

$var2 = array(1, 2, 3);
echo (bool) $var2 ? "true" : "false"; // true
echo (string) $var2; // "Array"

3.6 对象转换

  • 对象转换为布尔值:总是转换为 true
  • 对象转换为字符串:如果对象有 __toString() 方法,则调用该方法;否则产生错误
php
class Person {
    public $name = "John";
    
    public function __toString() {
        return "Person: {$this->name}";
    }
}

$var = new Person();
echo (bool) $var ? "true" : "false"; // true
echo (string) $var; // "Person: John"

4. 类型转换的应用场景

4.1 表单数据处理

php
// 处理表单数据
$age = (int) $_POST['age'];
$price = (float) $_POST['price'];
$is_active = (bool) $_POST['is_active'];

// 验证数据
if ($age < 18) {
    echo "年龄必须大于 18";
}

4.2 数据库操作

php
// 准备 SQL 参数
$id = (int) $_GET['id'];
$name = (string) $_POST['name'];
$price = (float) $_POST['price'];

// 构建 SQL 查询
$sql = "INSERT INTO products (id, name, price) VALUES ($id, '$name', $price)";

4.3 数学计算

php
// 确保使用正确的类型进行计算
$num1 = (float) "123.45";
$num2 = (float) "67.89";
$sum = $num1 + $num2;
echo "总和: $sum";

4.4 条件判断

php
// 检查变量是否为有效数字
$var = "123";
if (is_numeric($var)) {
    echo "是数字";
} else {
    echo "不是数字";
}

// 检查变量是否为数组
$var = array(1, 2, 3);
if (is_array($var)) {
    echo "是数组";
} else {
    echo "不是数组";
}

5. 最佳实践

5.1 类型安全

  • 明确类型:在关键位置明确指定变量类型
  • 类型检查:对外部输入进行类型检查
  • 避免混合类型:在同一上下文中保持类型一致
  • 使用严格比较:在需要类型匹配的情况下使用 ===!==

5.2 性能考虑

  • 避免频繁转换:减少不必要的类型转换
  • 选择合适的转换方式:对于简单转换,使用类型转换操作符;对于复杂转换,使用专门的函数
  • 缓存转换结果:对于重复使用的转换结果,进行缓存

5.3 代码可读性

  • 注释类型:为复杂的类型转换添加注释
  • 使用描述性变量名:使用能够反映变量类型的变量名
  • 保持一致性:在整个代码库中保持一致的类型转换风格

6. 示例:类型转换综合应用

php
<?php
// 模拟表单提交
$_POST = [
    'name' => 'John Doe',
    'age' => '30',
    'height' => '1.75',
    'is_active' => '1',
    'hobbies' => 'reading,coding,traveling'
];

// 处理表单数据
$name = (string) $_POST['name'];
$age = (int) $_POST['age'];
$height = (float) $_POST['height'];
$is_active = (bool) $_POST['is_active'];
$hobbies = explode(',', $_POST['hobbies']);

// 类型检查
if (!is_string($name)) {
    echo "姓名必须是字符串<br>";
}

if (!is_int($age) || $age < 0) {
    echo "年龄必须是正整数<br>";
}

if (!is_float($height) || $height < 0) {
    echo "身高必须是正数<br>";
}

if (!is_bool($is_active)) {
    echo "活跃状态必须是布尔值<br>";
}

if (!is_array($hobbies)) {
    echo "爱好必须是数组<br>";
}

// 输出结果
echo "姓名: $name, 类型: " . gettype($name) . "<br>";
echo "年龄: $age, 类型: " . gettype($age) . "<br>";
echo "身高: $height, 类型: " . gettype($height) . "<br>";
echo "活跃状态: " . ($is_active ? "是" : "否") . ", 类型: " . gettype($is_active) . "<br>";
echo "爱好: " . implode(", ", $hobbies) . ", 类型: " . gettype($hobbies) . "<br>";

// 类型转换示例
$num_str = "123.45";
$num_int = (int) $num_str;
$num_float = (float) $num_str;
$num_bool = (bool) $num_str;

 echo "<br>类型转换示例:<br>";
echo "原始值: $num_str, 类型: " . gettype($num_str) . "<br>";
echo "转换为整数: $num_int, 类型: " . gettype($num_int) . "<br>";
echo "转换为浮点数: $num_float, 类型: " . gettype($num_float) . "<br>";
echo "转换为布尔值: " . ($num_bool ? "true" : "false") . ", 类型: " . gettype($num_bool) . "<br>";
?>

7. 总结

类型判断和类型转换是 PHP 编程中的重要部分:

  • 类型判断:使用 is_*() 系列函数可以判断变量的类型
  • 类型转换:可以通过强制转换、自动转换或函数转换来改变变量类型
  • 转换规则:不同类型之间的转换有特定的规则
  • 应用场景:类型转换在表单处理、数据库操作、数学计算等场景中非常有用

掌握类型判断和类型转换,可以写出更加健壮、安全的 PHP 代码。

© 2026 编程马·菜鸟教程 版权所有