PHP 数据类型
下面对 PHP 支持的数据类型做一次深入、系统的详解,帮助你全面理解各种类型的特性、使用场景与转换规则。
一、PHP 的类型分类
PHP 是 弱类型、动态类型 语言,其数据类型可分为三大类:
- 标量类型(Scalar Types)
- 整数(int)
- 浮点数(float或double)
- 字符串(string)
- 布尔值(bool)
 
- 整数(
- 复合类型(Compound Types)
- 数组(array)
- 对象(object)
 
- 数组(
- 特殊类型(Special Types)
- 资源(resource)
- 空值(NULL)
 
- 资源(
此外,自 PHP 7.1 起还支持两种伪类型(Pseudo Types):mixed(可接受任何类型)和返回值 void,以及 PHP 8 引入的联合类型(Union Types)。
二、标量类型详解
1. 整数(int)
- 定义:带符号整数,范围根据平台(32 位:±2³¹;64 位:±2⁶³)。
- 字面量格式:
- 十进制:123
- 八进制(前缀 0):0123→ 十进制 83
- 十六进制(前缀 0x):0x1A→ 十进制 26
- 二进制(前缀 0b,PHP 5.4+):0b1011→ 十进制 11
 
- 十进制:
- 示例:$a = 42; $b = 0xFF; // 255 $c = 0755; // 493
2. 浮点数(float / double)
- 定义:双精度浮点数,用于表示小数或指数。
- 字面量格式:
- 普通小数:3.14
- 科学计数法:1.2e3→ 1200
 
- 普通小数:
- 注意:浮点数精度有限,比较时需谨慎。
- 示例:$f1 = 3.14; $f2 = 1.2e-2; // 0.012
3. 字符串(string)
- 定义:一串字符序列,可用单引号、双引号或 Heredoc/Nowdoc 表示。
- 单引号:字面输出,除 \\和\'外不解析转义或变量。
- 双引号:解析常见转义(\n、\t等)和变量插值。
- 示例:$s1 = 'Hello\nWorld'; // 输出 Hello\nWorld $s2 = "Hello\nWorld"; // 换行输出 Hello 和 World $name = 'Bob'; $s3 = "Hi, $name!"; // Hi, Bob!
4. 布尔值(bool)
- 定义:true或false。
- 转换规则:以下值会被视为 false,其余为true:- 布尔 false
- 整数 0
- 浮点 0.0
- 空字符串 ""或"0"
- 空数组 []
- NULL
 
- 布尔 
- 示例:var_dump((bool) 0); // bool(false) var_dump((bool) "0"); // bool(false) var_dump((bool) []); // bool(false)
三、复合类型详解
1. 数组(array)
- 定义:有序映射,可存储多个值,包括索引数组、关联数组和混合数组。
- 创建方式:// 索引数组 $nums = [1, 2, 3]; // 关联数组 $user = [ 'name' => 'Alice', 'age' => 25, ]; // 混合 $mix = [ 0 => 'zero', 'one' => 1, 42 => 'forty-two', ];
- 常用操作:count()、array_push()、array_pop()、array_keys()、array_values()、foreach遍历等。
2. 对象(object)
- 定义:类的实例,包含属性与方法。
- 示例:class Person { public string $name; public function __construct(string $n) { $this->name = $n; } public function greet() { return "Hi, I'm {$this->name}"; } } $p = new Person('Bob'); echo $p->greet(); // Hi, I'm Bob
- 类型检查与转换:
- instanceof运算符
- stdClass可作为通用空对象使用
 
四、特殊类型详解
1. 资源(resource)
- 定义:一种对外部资源(文件句柄、数据库连接、图像资源等)的引用。
- 示例:$fp = fopen('file.txt', 'r'); // resource type (stream) var_dump($fp);
- 注意:资源在脚本结束时自动释放,可使用 fclose()、mysqli_close()等手动关闭。
2. 空值(NULL)
- 定义:只有一个值 NULL,表示变量无值或未定义。
- 判断:is_null()或=== NULL。
- 示例:$x = null; var_dump(isset($x)); // bool(false) var_dump(is_null($x)); // bool(true)
五、类型检测与转换
1. 检测函数
| 函数 | 说明 | 
|---|---|
| gettype($var) | 返回类型字符串 | 
| is_int() | 是否整数 | 
| is_float() | 是否浮点 | 
| is_string() | 是否字符串 | 
| is_bool() | 是否布尔 | 
| is_array() | 是否数组 | 
| is_object() | 是否对象 | 
| is_resource() | 是否资源 | 
| is_null() | 是否 NULL | 
2. 强制转换
- 语法:(int)$var、(float)$var、(string)$var、(bool)$var、(array)$var、(object)$var。
- 示例:$x = "123abc"; $i = (int)$x; // 123 $b = (bool)$x; // true (非空字符串) $arr = (array)$x; // ['123abc']
六、PHP 7+ 的类型声明与 PHP 8 的联合类型
1. 类型声明(Type Hinting)
- 参数声明:function add(int $a, float $b): float { return $a + $b; }
- 返回值声明:在 ): type中声明。
- 严格模式:在文件顶部加 declare(strict_types=1);可开启严格类型检查,否则为宽松模式。
2. 联合类型(PHP 8+)
- 语法:在类型之间用竖线 |分隔:function foo(int|string $x): int|false { // ... }
- 混合类型:可使用 mixed(等同于int|float|string|bool|array|object|resource|null)。
七、小结与最佳实践
- 了解隐式转换:避免在关键逻辑中依赖类型自动转换,推荐显式转换或开启严格模式。
- 合理使用类型声明:函数参数与返回值声明类型,提高代码可读性与安全性。
- 善用检测函数:在处理外部输入(如表单、API)时,先用 is_*函数校验类型。
- 区分资源与对象:资源类型在 PHP 7+ 中逐渐被扩展封装为对象(如 PDO),新代码优先使用对象。
- 关注 PHP 版本特性:根据项目运行的 PHP 版本选择合适的语法,如联合类型、mixed、void等。
通过以上详解,你应已对 PHP 支持的各种数据类型有了全面、深入的认识。结合实际项目需求,灵活运用不同类型及其特性,能帮助你写出更健壮、易维护的代码。若有更多疑问,欢迎继续交流!