PHP 数据类型
变量存什么类型的数据?PHP 一共支持 8 种原始数据类型,分三大类:标量(scalar)、复合(compound)、特殊(special)。这一章把它们全部讲清楚,并重点说明 PHP 弱类型最容易踩的几个坑。
1. 类型总览
- 标量类型(4 种):
int(整型)、float(浮点型)、string(字符串)、bool(布尔型)。 - 复合类型(2 种):
array(数组)、object(对象)。 - 特殊类型(2 种):
null(无值)、resource(资源,如文件句柄、数据库连接)。 - PHP 8 新增:callable(可调用)、iterable(可迭代)、mixed(任意)、never(永不返回)等"伪类型",用于函数签名。
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几个要点:
- int:范围与平台有关,64 位系统约为 ±9.2×1018。超出会自动转成 float。
- float:精度约 14 位十进制数。比较两个浮点数不要用 ==,应该用
abs取差值的绝对值,再判断是否足够小。 - bool:只有
true/false(关键字不区分大小写,但永远小写)。 - string:PHP 字符串就是字节序列,长度几乎无限。详见第 10 章。
3. 特殊类型:null 与 resource
<?php
// null:表示变量没有值
$a = null;
var_dump($a); // NULL
// 未赋值的变量默认是 null(但会触发警告)
// $undefined; // Warning: Undefined variable
// 用 is_null 检查
var_dump(is_null($a)); // trueresource 类型表示外部资源(打开的文件、数据库连接、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 章面向对象。这里先看一眼:
class定义类(模板)。new创建对象实例。- 对象有属性(数据)和方法(行为)。
- 对象是引用类型——赋值给另一个变量不会复制对象,而是共享引用。
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+ 的严格类型
大型项目想避免弱类型带来的混乱,可以在文件开头加:
declare(strict_types=1);— 启用严格类型模式,函数参数类型不符时直接报错而不自动转换。- 函数签名加类型声明:
function add(int $a, int $b): int。 - PHP 8 加入联合类型(
int|string)、交集类型,类型系统越来越强。
小结
这一章你了解了 PHP 的 8 种数据类型、类型检查、类型转换,以及弱类型最大的坑——自动转换。下一篇运算符会继续把这些类型组合起来,做实际的运算。
← 上一篇 PHP 变量
下一篇 PHP 运算符 →