随着PHP8的发布,属性可空性成为了一个重要的新特性。这个特性使得我们可以声明一个属性可以为空,使得我们可以更好地控制我们的代码,并且可以帮助我们减少一些潜在的错误。
属性可空性是什么?
在PHP之前,我们只能声明属性为固定类型(例如字符串、整数、布尔等)。然而,在某些情况下,属性可能不会被初始化或者赋值为空。这意味着在调用这些属性时,我们可能会遇到一个致命的错误,例如未定义的变量或者无法调用未定义的方法。
属性可空性是通过在属性声明前面添加问号来实现的。例如,我们可以声明一个可空字符串属性如下:
public ?string $name;
这意味着我们可以将这个属性设置为NULL,而不是一个字符串,从而避免了致命错误。
如何使用属性可空性提升代码质量?
使用属性可空性可以大大提升代码质量,以下是一些例子:
- 在方法中使用属性可空性
例如,我们有一个Person类,其中有一个名字和一个年龄属性。我们可以使用属性可空性来确保我们的代码安全,如下所示:
class Person {
public ?string $name;
public ?int $age;
public function displayInfo(): string {
$name = $this->name ?? "Unknown";
$age = $this->age ?? "Unknown";
return "Name: $name, Age: $age";
}
}
在上面的例子中,我们使用了空合并运算符(??)来为未定义的属性提供默认值。这意味着即使属性为NULL,我们的代码也不会出现致命错误。
- 检查属性是否为空
在某些情况下,我们希望检查属性是否为空。例如,如果我们使用一个空白的字符串作为默认值,我们可能希望禁止用户传递空字符串。我们可以使用属性可空性来实现这一点,如下所示:
class User {
public ?string $name;
public function setName(?string $name): void {
if ($name === "") {
throw new InvalidArgumentException("Name can't be empty");
}
$this->name = $name;
}
}
在上面的例子中,我们使用了一个类型为NULL或字符串的可空$name属性。在setName方法中,我们首先检查$name是否为空白的字符串,如果是,则抛出一个异常。否则,我们将值分配给属性。
- 取消引用可空属性
在某些情况下,我们可能希望将可空属性转换为非空属性。例如,我们可能有一个关联数组,其中包含与对象属性相同的键。我们可以使用属性可空性来将这些值转换为对象属性,如下所示:
class Post {
public ?string $title;
public ?string $content;
public function __construct(array $data) {
$this->title = $data['title'] ?? null;
$this->content = $data['content'] ?? null;
}
public function toObject(): object {
$obj = (object)[];
foreach ($this as $key => $value) {
$obj->{$key} = &$this->{$key};
}
return $o
.........................................................