首页 / PHP 入门教程 / PHP 数据类型(下)

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"];  // 张三
?>
Tip

PHP 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);
?>
Tip

PHP 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+ 会触发弃用警告
?>
Note

PHP 默认模式下仍会做类型强制转换,不会报错。要彻底禁止隐式转换,必须在文件开头声明 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"文本数据
int42整数
float3.14浮点数
booltrue布尔值
nullnull空值
array[1, 2, 3]有序映射
objectnew Car()类实例
callablefn() => 1可调用
mixed-任意类型(PHP 8.0+)
union`stringint`

来源:参考了 w3cschool「PHP 数据类型」、runoob「PHP 数据类型」以及 php.net 官方文档,综合改写后所得。