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 支持的各种数据类型有了全面、深入的认识。结合实际项目需求,灵活运用不同类型及其特性,能帮助你写出更健壮、易维护的代码。若有更多疑问,欢迎继续交流!