使用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中判断他们的推理。因此,问题是:
1条答案
按热度按时间polhcujo1#
trait不能有示例属性,因此应用此属性是没有意义的。也许你期望所有使用trait的类都能自动获得这个属性,但是使用trait并不等同于继承。要做到这一点,你需要编写额外的代码。由于这已经是一个不推荐使用的功能,并且将在下一个版本中删除,因此似乎没有必要这样做。