PHP 入门教程
PHP 数据类型(下)
本教程共 65 篇 · 第 7 篇 · 更新于 2026-07-24 · 约 4 分钟阅读
PHPPHP8数组对象资源回调类型声明
7. PHP 数据类型(下)
本节目标:掌握数组、对象、资源、回调和类型声明。学完你能使用复合数据类型,并为代码添加类型约束。
7.1 数组(Array)
数组可以在一个变量中存储多个值:
<?php
// 索引数组:键是数字,从 0 开始
$fruits = ["苹果", "香蕉", "橙子"];
echo $fruits[0]; // 苹果
// 关联数组:键是自定义字符串
$user = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];
echo $user["name"]; // 张三
?>
TipPHP 5.4+ 起推荐使用短数组语法
[],替代传统的array()。[]写法更简洁,是现代 PHP 的标配。
多维数组
数组的元素也可以是数组:
<?php
$users = [
["name" => "张三", "age" => 25],
["name" => "李四", "age" => 30],
["name" => "王五", "age" => 28]
];
echo $users[1]["name"]; // 李四
echo $users[2]["age"]; // 28
?>
数组常用操作
<?php
$arr = ["a" => "苹果", "b" => "香蕉"];
// 添加元素
$arr["c"] = "橙子";
// 删除元素
unset($arr["b"]);
// 修改元素
$arr["a"] = "红苹果";
// 数组长度
$count = count($arr);
var_dump($arr);
?>
7.2 对象(Object)
对象是类的实例,用于封装数据和行为:
<?php
class Car {
public string $brand;
public string $color;
public function __construct(string $brand, string $color) {
$this->brand = $brand;
$this->color = $color;
}
public function drive(): string {
return "{$this->color}的{$this->brand}在行驶";
}
}
$myCar = new Car("丰田", "白色");
echo $myCar->drive(); // 白色的丰田在行驶
?>
Note上面的代码使用了 PHP 8.0+ 的类型声明和构造函数属性提升语法。面向对象将在第 19-22 章详细讲解。
7.3 资源(Resource)
资源是一种特殊变量,保存对外部资源的引用:
<?php
// 打开文件,返回资源
$file = fopen("test.txt", "r");
var_dump($file); // resource(5) of type (stream)
// 连接数据库,返回资源(mysqli 扩展)
$conn = mysqli_connect("localhost", "user", "pass", "db");
// 使用完毕后释放资源
fclose($file);
mysqli_close($conn);
?>
TipPHP 8.0 起,许多资源类型正逐步被对象替代(如
GdImage对象替代了图像资源)。这被称为”资源对象化”。
7.4 回调(Callable)
回调表示可以被调用的函数或方法:
<?php
// 函数名作为回调
function greet(string $name): string {
return "你好,$name";
}
$func = "greet";
echo $func("张三"); // 你好,张三
// 匿名函数作为回调
$square = function(int $n): int {
return $n * $n;
};
echo $square(5); // 25
// PHP 7.4+ 箭头函数
$double = fn(int $n): int => $n * 2;
echo $double(5); // 10
?>
7.5 类型声明
PHP 5 起支持函数参数类型声明,PHP 7+ 大幅增强了类型系统:
标量类型声明
<?php
function add(int $a, int $b): int {
return $a + $b;
}
echo add(2, 3); // 5
echo add(2.5, 3); // 默认会尝试转换(2.5 转为 2),PHP 8.1+ 会触发弃用警告
?>
NotePHP 默认模式下仍会做类型强制转换,不会报错。要彻底禁止隐式转换,必须在文件开头声明
declare(strict_types=1);。PHP 8.1 起,隐式 float 转 int 会触发 E_DEPRECATED 警告。
联合类型(PHP 8.0+)
<?php
function parseValue(string|int $input): float {
return (float) $input;
}
echo parseValue("3.14"); // 3.14
echo parseValue(42); // 42.0
?>
可空类型
<?php
// ?string 表示 string 或 null
function findUser(int $id): ?array {
if ($id <= 0) {
return null;
}
return ["id" => $id, "name" => "用户$id"];
}
$user = findUser(5);
var_dump($user); // array(...)
$user = findUser(-1);
var_dump($user); // null
?>
mixed 类型(PHP 8.0+)
<?php
// mixed 表示接受任意类型
function dump(mixed $value): void {
var_dump($value);
}
dump("hello");
dump(123);
dump([1, 2, 3]);
?>
严格模式
在文件开头添加 declare(strict_types=1);,PHP 将严格执行类型检查,不再自动转换:
<?php
declare(strict_types=1);
function multiply(int $a, int $b): int {
return $a * $b;
}
multiply(2, 3); // 正常
multiply(2.5, 3); // TypeError: 必须是整数,不能传浮点数
?>
Note
strict_types只对当前文件有效,不会影响被调用的其他文件。这是 PHP 类型系统的独特设计。
7.6 类型总结表
| 类型 | 示例 | 说明 |
|---|---|---|
| string | "hello" | 文本数据 |
| int | 42 | 整数 |
| float | 3.14 | 浮点数 |
| bool | true | 布尔值 |
| null | null | 空值 |
| array | [1, 2, 3] | 有序映射 |
| object | new Car() | 类实例 |
| callable | fn() => 1 | 可调用 |
| mixed | - | 任意类型(PHP 8.0+) |
| union | `string | int` |
来源:参考了 w3cschool「PHP 数据类型」、runoob「PHP 数据类型」以及 php.net 官方文档,综合改写后所得。