17611538698
webmaster@21cto.com

PHP 8.2 推出只读类的创建

编程语言 0 950 2022-06-25 08:27:43

导读:


readonly 属性是在 PHP8.1 中实现的,但是这个 readonly 修饰符现在也可用于类。


无需为每个属性设置只读,您将能够严格操作类本身。


以下是相关 RFC,Readonly classes的中文说明。


PHP RFC:只读类


简介


PHP 8.1现在支持 readonly 属性。

但是,例如,声明一个具有许多属性的不可变类仍然很烦人。


因此,此 RFC 建议支持只读类。


提议


允许在 PHP8.1 中添加的只读也适用于类。


PHP8.2

readonly class Test {public string $prop;}


这使得类中的所有属性都是只读的。它还禁止创建动态属性。


readonly class Foo{    public int $bar;

public function __construct() { $this->bar = 1; }}

$foo = new Foo();

$foo->bar = 2; // Fatal Error: Uncaught Error: Cannot modify readonly property Foo::$bar$foo->baz = 1; // Fatal Error: Uncaught Error: Cannot create dynamic property Foo::$baz


另外,在Deprecate dynamic properties#[AllowDynamicProperties]的 RFC 中,支持通过指定继续使用动态属性,但禁止为 readonly 类指定。


#[AllowDynamicProperties]readonly class Foo {}

// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo


限制


你不能声明无类型或静态属性。


readonly class Foo{    public $bar;            // Fatal error: Readonly property Foo::$bar must have type    public static int $baz; // Fatal error: Readonly class Foo cannot declare static properties}


扩展


与 readonly 属性一样,可以使用 readonly 类扩展 readonly 类。


readonly class A {}readonly class B extends A {}


禁止用非只读类扩展只读类,反之亦然。


readonly class A {}class B extends A {}// Fatal error: Non-readonly class B cannot extend readonly class A

class A {}readonly class B extends A {}// Fatal error: Readonly class B cannot extend non-readonly class A


反射


ReflectionClass::isReadOnly()添加了一个方法来检查该类是否是只读的。

它还ReflectionClass::getModifiers()向方法ReflectionClass::IS_READONLY添加了一个标志。


向后不兼容的更改


没有不兼容的更改。




投票


投票时间为 2022/04/27 至 2022/05/11。


该 RFC 以 28 票赞成和 7 票反对的多数票被接受。


总结


只能分配一次,分配后不能更改。

简而言之,它是一个不可变的对象。


readonly class Foo{public function __construct(        public int $bar    ) {}}

$foo = new Foo(1); // OK$foo->bar = 2; // NG

readonly 的类不能设置静态属性,不能使用动态属性,需要指定类型,而且一旦设置的值不能重写,能做的就很有限了。


可以防止意外重写某处的值等事故,并且可以运行健壮且高度安全的实例。


PHP 9.0最终禁止访问未定义的属性,但 readonly 类几乎向上兼容。


评论