PHP 数据类型

下面对 PHP 支持的数据类型做一次深入、系统的详解,帮助你全面理解各种类型的特性、使用场景与转换规则。


一、PHP 的类型分类

PHP 是 弱类型、动态类型 语言,其数据类型可分为三大类:

  1. 标量类型(Scalar Types)
    • 整数(int
    • 浮点数(float 或 double
    • 字符串(string
    • 布尔值(bool
  2. 复合类型(Compound Types)
    • 数组(array
    • 对象(object
  3. 特殊类型(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)。

七、小结与最佳实践

  1. 了解隐式转换:避免在关键逻辑中依赖类型自动转换,推荐显式转换或开启严格模式。
  2. 合理使用类型声明:函数参数与返回值声明类型,提高代码可读性与安全性。
  3. 善用检测函数:在处理外部输入(如表单、API)时,先用 is_* 函数校验类型。
  4. 区分资源与对象:资源类型在 PHP 7+ 中逐渐被扩展封装为对象(如 PDO),新代码优先使用对象。
  5. 关注 PHP 版本特性:根据项目运行的 PHP 版本选择合适的语法,如联合类型、mixedvoid 等。

通过以上详解,你应已对 PHP 支持的各种数据类型有了全面、深入的认识。结合实际项目需求,灵活运用不同类型及其特性,能帮助你写出更健壮、易维护的代码。若有更多疑问,欢迎继续交流!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注