ZetCode

PHP 中的类型转换

最后修改于 2025 年 6 月 3 日

在本文中,我们将探讨 PHP 的类型转换系统,包括自动转换、显式类型转换和常用的转换函数。

PHP 是一种动态类型语言,这意味着变量没有固定的类型。它会在需要时自动在类型之间转换值,这个过程被称为类型杂耍

由于 PHP 根据变量的赋值来确定其类型,因此它提供了很大的灵活性。然而,这种动态行为有时会导致意想不到的结果,如果类型没有被仔细管理。例如,一个变量最初可以保存一个字符串,后来被分配一个整数而不会导致错误。虽然方便,但这可能会在变量类型至关重要的场景中(例如算术运算或比较)产生问题。

PHP 类型转换概述

PHP 支持几种类型:整数、浮点数、字符串、布尔值、数组和对象。类型转换允许你根据需要在这几种类型之间进行转换。

转换类型 描述 示例
类型杂耍 表达式中的自动转换 $sum = "5" + 2; // int(7)
类型转换 使用类型转换的显式转换 $int = (int) "123";
settype() 更改变量的类型 settype($var, "float");
转换函数 专门的转换函数 $num = intval("42");

该表总结了在 PHP 中转换类型的主要方法。类型杂耍会在表达式中自动发生,而类型转换允许显式转换。settype() 函数更改变量的类型,而 intval() 等转换函数提供专门的转换。

类型杂耍(自动转换)

PHP 会根据上下文自动转换表达式中的类型。这被称为类型杂耍。

type_juggling.php
<?php

// String to number conversion
$sum = "10" + 5;  // int(15)
echo gettype($sum) . ": " . $sum . "\n";

// Boolean conversion
$result = "hello" == true;  // bool(true)
var_dump($result);

// String concatenation
$concat = 5 . " items";  // string(7) "5 items"
echo $concat . "\n";

// Float to int in array key
$arr = [3.5 => "value"];
echo array_key_first($arr);  // int(3)

PHP 在这些常见情况下自动转换类型

$ php type_juggling.php
integer: 15
bool(true)
5 items
3

显式类型转换

PHP 提供了几种方法,可以使用类型转换运算符在类型之间进行显式转换。

casting.php
<?php

// String to integer
$int = (int) "123";
echo "int: " . $int . "\n";

// Float to integer (truncates)
$truncated = (int) 3.99;
echo "truncated: " . $truncated . "\n";

// Integer to boolean
$bool = (bool) 1;
var_dump($bool);

// Array to string
$str = (string) [1, 2];
echo "array as string: " . $str . "\n";

// Available cast types:
// (int), (integer) - to integer
// (bool), (boolean) - to boolean
// (float), (double), (real) - to float
// (string) - to string
// (array) - to array
// (object) - to object
// (unset) - to NULL (deprecated)

当您需要确保变量或函数参数具有特定类型时,类型转换很有用。请注意,某些类型转换(如数组到字符串)会产生标准化结果(“Array”),而不是转换内容。

$ php casting.php
int: 123
truncated: 3
bool(true)
array as string: Array

转换函数

PHP 提供了专门的函数,用于进行类型转换,并提供额外的控制。

conversion_functions.php
<?php

// String to number conversion
$num = intval("42 items");  // 42
$float = floatval("3.14");  // 3.14

// Base conversion
$hex = hexdec("FF");  // 255
$bin = bindec("1010"); // 10

// Type setting
$var = "123.45";
settype($var, "float");

// String representation
$str = strval(123);

echo "intval: " . $num . "\n";
echo "hexdec: " . $hex . "\n";
echo "settype: " . gettype($var) . "\n";

这些函数比简单的类型转换提供更多的控制

$ php conversion_functions.php
intval: 42
hexdec: 255
settype: double

字符串到数字的转换

PHP 可以在算术运算中自动将字符串转换为数字,或者您可以使用显式类型转换和 intvalfloatval 等函数进行更多控制。这在解析用户输入或处理来自外部源的数据时很有用。

string_to_number.php
<?php

// Automatic in arithmetic
$sum = "10" + 5;  // 15

// Explicit with casting
$num = (int) "123";

// Using intval() with base
$hex = intval("FF", 16);  // 255

// Float conversion
$price = floatval("19.99");

echo "sum: $sum, num: $num, hex: $hex, price: $price\n";

数字到字符串的转换

数字可以在连接期间自动转换为字符串,或者使用类型转换或格式化函数(如 sprintf)进行显式转换。这对于在输出中显示数字或构建动态字符串很有帮助。

number_to_string.php
<?php

// Automatic in concatenation
$str = "Value: " . 42;

// Explicit casting
$strNum = (string) 123;

// Formatted conversion
$formatted = sprintf("%.2f", 3.14159);

echo "$str\n$strNum\n$formatted\n";

布尔转换规则

PHP 具有将值转换为布尔值的特定规则。像 false00.0"""0"、空数组和 null 这样的值被认为是 false;所有其他值都是 true。理解这些规则对于编写正确的条件逻辑很重要。

boolean_conversion.php
<?php

// Values that evaluate to false:
// false, 0, 0.0, "", "0", [], null

$trueValues = [1, "hello", [1], true];
$falseValues = [0, "", null, []];

foreach ($trueValues as $val) {
    echo "$val is " . ($val ? "true" : "false") . "\n";
}

上面的代码演示了不同的值在 PHP 中如何求值为 true 或 false。这对于理解条件在 if 语句等控制结构中的工作方式至关重要。

类型检查函数

类型检查函数帮助您在执行转换或操作之前验证变量的类型。这可以防止错误并使您的代码更加健壮,尤其是在处理用户输入或动态数据时。

函数 描述 示例
is_int 检查是否为整数 is_int(42)
is_float 检查是否为浮点数 is_float(3.14)
is_numeric 检查是否为数字或数字字符串 is_numeric("123")
is_string 检查是否为字符串 is_string("text")
is_array 检查是否为数组 is_array([])
is_bool 检查是否为布尔值 is_bool(true)

上面的函数允许您在执行操作或转换之前检查变量的类型。这在处理用户输入或来自外部源的数据时特别有用,因为这些数据的类型可能无法保证。

严格类型比较

对于严格的类型检查,请使用 === 而不是 ==

strict_comparison.php
<?php

// Loose comparison (type juggling)
if (0 == "0") {  // true
    echo "Loose match\n";
}

// Strict comparison (type and value)
if (0 === "0") {  // false
    echo "This won't print\n";
} else {
    echo "Strict mismatch\n";
}

=== 运算符检查值和类型,而 == 在比较之前执行类型杂耍。

来源

PHP 手册:类型杂耍
PHP 手册:类型转换

理解 PHP 的类型转换系统对于编写健壮的代码至关重要。虽然类型杂耍很方便,但使用显式类型转换和严格的比较可以防止一些微妙的错误。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程