PHP从5.0版本开始逐步引入类型提示功能,后续版本不断完善相关特性,通过类型提示可以明确指定变量、函数参数、返回值等的数据类型,让代码逻辑更清晰,也能在开发阶段提前发现类型不匹配的问题。

函数参数类型提示
在函数定义时,可以给参数指定预期的类型,当传入的参数类型不符合要求时,PHP会抛出TypeError错误。支持的类型包括标量类型、复合类型和自定义类类型。
以下是基础的函数参数类型提示示例:
<?php
// 指定参数必须为字符串类型
function printName(string $name) {
echo "姓名:" . $name;
}
// 指定参数必须为数组类型
function sumArray(array $nums) {
return array_sum($nums);
}
// 指定参数必须为自定义类的实例
class User {}
function handleUser(User $user) {
echo "处理用户对象";
}
// 正确调用
printName("张三");
sumArray([1, 2, 3]);
$user = new User();
handleUser($user);
// 错误调用,会抛出TypeError
printName(123);
?>
返回值类型提示
PHP 7.0及以上版本支持返回值类型提示,在函数定义末尾通过冒号加类型的方式指定函数返回值的类型,若返回值类型不匹配同样会抛出错误。
返回值类型提示的示例如下:
<?php
// 指定返回值必须为int类型
function add(int $a, int $b): int {
return $a + $b;
}
// 指定返回值可以为null,需要加?前缀
function getUserById(int $id): ?User {
if ($id > 0) {
return new User();
}
return null;
}
class User {}
// 正确调用
$result = add(1, 2);
$user = getUserById(1);
// 错误调用,返回值类型不匹配
function wrongReturn(): string {
return 123;
}
?>
类属性类型提示
PHP 7.4及以上版本支持类属性的类型提示,在定义类属性时可以直接指定属性的类型,不需要再通过构造函数或者setter方法手动校验类型。
类属性类型提示的示例如下:
<?php
class Product {
// 属性类型提示,指定为字符串
public string $name;
// 属性类型提示,指定为float,允许为null
public ?float $price;
// 属性类型提示,指定为数组
public array $tags;
public function __construct(string $name, ?float $price, array $tags) {
$this->name = $name;
$this->price = $price;
$this->tags = $tags;
}
}
$product = new Product("手机", 2999.99, ["电子", "数码"]);
// 错误赋值,会抛出TypeError
$product->name = 123;
?>
严格类型模式
默认情况下PHP的类型提示是弱类型的,比如传入int类型的参数到string类型提示的位置,PHP会自动做类型转换。如果需要开启严格类型校验,避免自动类型转换,可以在脚本开头声明declare(strict_types=1)。
严格类型的示例如下:
<?php
declare(strict_types=1); // 严格类型声明,必须放在脚本第一行
function printAge(int $age): void {
echo "年龄:" . $age;
}
// 弱类型模式下,传入字符串"18"会自动转为int 18
// 严格模式下,传入字符串"18"会直接抛出TypeError
printAge("18");
?>
类型提示支持的类型范围
PHP的类型提示支持以下几类类型:
- 标量类型:int、float、string、bool
- 复合类型:array、object、callable、iterable
- 特殊类型:null(需配合?前缀使用)、void(仅返回值可用)
- 自定义类、接口、抽象类的类型
需要注意,类型提示不支持资源类型(resource),如果需要校验资源类型,只能通过手动判断is_resource()函数实现。
注意事项
类型提示仅对函数参数、返回值、类属性生效,普通的局部变量无法直接添加类型提示,若需要校验局部变量类型,可使用is_系列函数或者assert()函数实现。
另外,类型提示的错误是在运行时抛出的,开发阶段建议配合IDE的类型检查功能,提前发现类型不匹配的问题,减少调试成本。
<?php
// 局部变量类型校验示例
$num = "123";
if (!is_int($num)) {
throw new InvalidArgumentException("变量必须为整数类型");
}
?>