📜  只读属性 - PHP 8.1 - PHP (1)

📅  最后修改于: 2023-12-03 15:22:56.248000             🧑  作者: Mango

只读属性 - PHP 8.1

PHP 8.1引入了只读属性,这是一个重要的功能。因为它可以更好地保护对象的内部状态,避免被意外地修改。同时,只读属性还可以帮助我们在并发环境下更好地管理数据。

声明只读属性

只读属性可以通过在属性声明前面添加关键字readonly来声明。例如:

class Foo {
    public readonly string $name;
    
    public function __construct(string $name) {
        $this->name = $name;
    }
}

在上面的代码中,$name属性被声明为只读属性,因此在构造函数之后它不能再被修改。

读取只读属性

只读属性可以像普通属性一样读取。例如:

$foo = new Foo('bar');
echo $foo->name;
修改只读属性

修改只读属性的值会触发一个Error异常。例如:

$foo = new Foo('bar');
$foo->name = 'baz'; // 抛出Error异常
只读属性和继承

只读属性通过可见性来继承。如果父类中的属性被声明为只读属性,那么子类中也必须将属性声明为只读属性。例如:

class Bar extends Foo {
    public readonly int $age;
    
    public function __construct(string $name, int $age) {
        parent::__construct($name);
        $this->age = $age;
    }
}

注意,在子类中声明的只读属性可以具有不同的类型和可见性,但不能更改只读属性的属性修饰符。

只读属性和类型推断

只读属性可以帮助类型推断更加精准。例如:

class Baz {
    public readonly array $list;
    
    public function __construct(array $list) {
        $this->list = $list;
    }
}

$baz = new Baz([1, 2, 3]);
$baz->list[] = 'four'; // Type error: Cannot assign value to readonly property Baz::$list

在上面的代码中,因为$list属性被声明为只读属性,所以在对其进行修改时会提示类型错误。

总结

只读属性是一个非常有用的功能,可以帮助我们更好地管理对象状态。然而,只读属性虽然可以保护对象的状态,但并不能完全防止意外修改,因此应该还是要注意编写健壮的代码。