跳到主要内容

PHP 可为空类型

介绍

在 PHP 7.1 中,引入了一个重要的新特性:可为空类型(Nullable Types)。这一特性允许我们在类型声明中明确表示一个变量、参数或返回值既可以是指定的类型,也可以是 null。通过使用可为空类型,我们可以更好地表达代码的意图,减少因 null 值引发的潜在错误。

在本文中,我们将逐步讲解可为空类型的语法、使用场景以及实际案例,帮助你掌握这一现代 PHP 特性。


什么是可为空类型?

在 PHP 中,类型声明用于指定变量、参数或返回值的类型。例如,我们可以声明一个函数参数为 string 类型,表示该参数必须是一个字符串。然而,在某些情况下,我们可能希望允许参数或返回值为 null。这时,可为空类型就派上用场了。

可为空类型的语法非常简单:在类型名称前加上一个问号 ?。例如:

php
function greet(?string $name): void {
echo "Hello, " . ($name ?? "Guest") . "!";
}

在上面的例子中,$name 参数可以是 string 类型,也可以是 null


语法详解

1. 可为空参数

在函数或方法中,我们可以将参数声明为可为空类型。例如:

php
function printName(?string $name): void {
if ($name === null) {
echo "Name is not provided.";
} else {
echo "Name: " . $name;
}
}
  • 如果调用 printName("Alice"),输出将是 Name: Alice
  • 如果调用 printName(null),输出将是 Name is not provided.

2. 可为空返回值

我们也可以将函数的返回值声明为可为空类型。例如:

php
function findUserById(int $id): ?User {
// 假设这是一个查找用户的函数
if ($id === 1) {
return new User("Alice");
}
return null;
}
  • 如果 $id1,函数将返回一个 User 对象。
  • 如果 $id 不是 1,函数将返回 null

3. 可为空属性

在类的属性中,我们也可以使用可为空类型。例如:

php
class Profile {
public ?string $bio = null;
}
  • $bio 属性可以是 string 类型,也可以是 null

实际应用场景

场景 1:处理可选参数

假设我们有一个函数,用于格式化用户的地址。地址是可选的,因此我们可以将参数声明为可为空类型:

php
function formatAddress(?string $street, ?string $city, ?string $zip): string {
$addressParts = array_filter([$street, $city, $zip]);
return implode(", ", $addressParts);
}
  • 如果调用 formatAddress("123 Main St", "Springfield", "12345"),输出将是 123 Main St, Springfield, 12345
  • 如果调用 formatAddress(null, "Springfield", null),输出将是 Springfield

场景 2:数据库查询结果

在数据库查询中,某些字段可能为空。我们可以使用可为空类型来表示这种情况:

php
function getUserEmail(int $userId): ?string {
// 模拟数据库查询
if ($userId === 1) {
return "alice@example.com";
}
return null;
}
  • 如果 $userId1,函数将返回用户的电子邮件地址。
  • 如果 $userId 不存在,函数将返回 null

注意事项

警告
  1. 默认值:可为空类型的参数不能有默认值(除了 null)。例如,以下代码会报错:
    php
    function greet(?string $name = "Guest"): void {
    // 错误:可为空参数不能有默认值
    }
  2. 类型检查:在使用可为空类型时,务必进行类型检查,以避免潜在的运行时错误。

总结

PHP 的可为空类型是一个强大的特性,它允许我们更清晰地表达代码的意图,并减少因 null 值引发的错误。通过将参数、返回值或属性声明为可为空类型,我们可以编写更健壮、更易读的代码。


附加资源与练习

练习

  1. 编写一个函数 calculateDiscount(?float $price, ?float $discountRate): ?float,计算商品的折扣价格。如果 $price$discountRatenull,则返回 null
  2. 修改一个现有的类,将其中的某些属性声明为可为空类型,并测试其行为。

进一步学习

  • 阅读 PHP 官方文档 中关于类型声明的部分。
  • 探索 PHP 7.4 引入的类型属性(Typed Properties)特性。