php 为什么AllowDynamicProperties属性不能应用于traits?

lzfw57am  于 2023-06-04  发布在  PHP
关注(0)|答案(1)|浏览(479)

使用PHP 8.2,creating dynamic properties was deprecated:如果一个类没有显式定义属性,那么尝试在该类上设置该属性会产生一个弃用通知,并且从PHP 9.0开始会抛出一个致命错误。
为了避免这种情况,文档说类应该实现__get()__set(),或者应用AllowDynamicProperties attribute
文档说属性可以应用于classes, methods, functions, parameters, properties and class constants--特别是省略了trait和接口。相反,最初的RFC包括traits和接口。
在实践中,用户态属性似乎可以应用于traits和接口,但对于(至少某些)原生属性来说,情况并非如此,例如AllowDynamicProperties(参见this GitHub comment)-这会抛出一个致命错误:

#[\AllowDynamicProperties]
trait MyTrait {}

我可以理解为什么这样的属性对于接口来说是不可取的,毕竟,接口不提供独立的功能,并且仅仅是一个契约。但是,就动态属性有价值的程度而言(我认为它们确实有价值),我看不出有任何理由表明它们在trait中的价值应该比在类中的价值低。trait可以提供需要动态属性的功能,就像类一样。
不推荐使用动态属性的RFC根本没有提到trait,只有类,所以我不能从RFC中判断他们的推理。因此,问题是:

为什么AllowDynamicProperties不能应用于traits,只能应用于类?这一决定背后的逻辑是什么?
polhcujo

polhcujo1#

trait不能有示例属性,因此应用此属性是没有意义的。也许你期望所有使用trait的类都能自动获得这个属性,但是使用trait并不等同于继承。要做到这一点,你需要编写额外的代码。由于这已经是一个不推荐使用的功能,并且将在下一个版本中删除,因此似乎没有必要这样做。

相关问题