PHP 数据类型

变量存什么类型的数据?PHP 一共支持 8 种原始数据类型,分三大类:标量(scalar)、复合(compound)、特殊(special)。这一章把它们全部讲清楚,并重点说明 PHP 弱类型最容易踩的几个坑。

1. 类型总览

2. 标量类型

标量是"单值"类型,一个变量只装一个值。PHP 的标量类型和大多数语言类似:

<?php
// 4 大标量类型(scalar)
$i = 42;             // int 整型
$f = 3.14;           // float 浮点型(也叫 double)
$s = "hello";        // string 字符串
$b = true;           // bool 布尔型(只有 true/false)

// 整型支持多种进制
$dec = 42;           // 十进制
$hex = 0x2A;         // 十六进制(=42)
$oct = 052;          // 八进制(=42)
$bin = 0b101010;     // 二进制(=42)

// 浮点型支持科学计数法
$sci = 1.5e3;        // 1500.0
$neg = 1.5e-3;       // 0.0015

几个要点:

3. 特殊类型:null 与 resource

<?php
// null:表示变量没有值
$a = null;
var_dump($a);        // NULL

// 未赋值的变量默认是 null(但会触发警告)
// $undefined;  // Warning: Undefined variable

// 用 is_null 检查
var_dump(is_null($a));   // true

resource 类型表示外部资源(打开的文件、数据库连接、cURL 句柄等),由函数返回,不能直接构造。PHP 8 后部分资源逐渐被改成 object 类型(如 GD 图像)。

4. 复合类型之一:数组(预热)

PHP 的数组非常特殊:它本质是一个有序字典,既能当列表用(数字索引),又能当字典用(字符串键)。一个数组可以同时混用数字键和字符串键,这是 PHP 区别于其他语言的核心特性。

<?php
// PHP 数组:实际上是有序字典,极其灵活
// 索引数组(数字下标)
$nums = [10, 20, 30];
echo $nums[1];                 // 20

// 关联数组(字符串下标)
$user = [
    "name" => "小明",
    "age"  => 25,
];
echo $user["name"];            // 小明

// 数组具体内容见第 9 章

数组的完整内容见第 9 章。这里你只需要知道:PHP 数组极其强大,几乎所有数据处理都围绕它展开。

5. 复合类型之二:对象

对象是面向对象编程(OOP)的核心,由 class 实例化而来。详见第 13 章面向对象。这里先看一眼:

6. 类型检查

调试时常需要看一个变量的类型。PHP 提供了多种方式:

<?php
$i = 42;
$s = "hi";
$arr = [1, 2, 3];

// gettype:返回类型字符串
echo gettype($i);              // integer
echo gettype($s);              // string
echo gettype($arr);            // array

// is_xxx 系列判断
is_int($i);                    // true
is_string($s);                 // true
is_array($arr);                // true
is_float(3.14);                // true
is_bool(true);                 // true
is_null(null);                 // true
is_numeric("42");              // true(数字字符串)
is_numeric("abc");             // false

// var_dump:打印类型和值(调试神器)
var_dump($i);
// 输出: int(42)

日常调试首选 var_dump(信息最全);判断类型用 is_xxx 系列函数;gettype 用于需要类型字符串的场景。

7. 类型转换

PHP 类型转换分两种:强制转换(显式)自动转换(隐式)。强制转换用 (类型) 强转运算符:

<?php
// 强制类型转换:(类型)值
$i = (int)3.99;            // 3(直接截断小数)
$s = (string)42;           // "42"
$f = (float)"3.14abc";     // 3.14
$b = (bool)0;              // false
$arr = (array)"hi";        // ["hi"]

// intval/floatval/strval 函数也能转
$i = intval("42abc");      // 42
$s = strval(3.14);         // "3.14"

8. 弱类型自动转换(重要陷阱!)

PHP 在运算时会自动转换类型,这是新手和资深开发者都会踩的坑:

<?php
// 弱类型自动转换(常见陷阱)
echo "3" + "4";            // 7 (字符串转数字相加)
echo "10 apples" + 5;      // 15 ("10 apples" 被解析为 10)
echo "abc" + 5;            // 5 ("abc" 被解析为 0)

// 比较 true/false
if ("0" == false) { /* true! */ }
if ("" == false)  { /* true! */ }
if (null == false) { /* true! */ }

// 永远用 === 严格比较,避免这些坑
if ("0" === false) { /* false,正确 */ }
if (0 === "0")     { /* false,类型不同 */ }

核心建议:永远用 ===(严格相等)代替 ==(弱相等)=== 会同时比较类型和值,避免 "0" == false 这类反直觉的结果。这是 PHP 防御性编程的第一条铁律。

9. PHP 7+ 的严格类型

大型项目想避免弱类型带来的混乱,可以在文件开头加:

小结

这一章你了解了 PHP 的 8 种数据类型、类型检查、类型转换,以及弱类型最大的坑——自动转换。下一篇运算符会继续把这些类型组合起来,做实际的运算。

← 上一篇 PHP 变量

下一篇 PHP 运算符

✈️💬