Php 为什么可以重写父类中使用的trait中定义的属性的初始值?
PHP文档说明了以下关于覆盖特性属性的内容: 如果特征定义了属性,那么类就不能定义属性 使用相同的名称,除非它兼容(相同的可见性和 初始值),否则将发出致命错误 但是,在抽象类中使用trait时,可以在扩展该抽象类的类中重写trait中定义的属性:Php 为什么可以重写父类中使用的trait中定义的属性的初始值?,php,oop,inheritance,traits,Php,Oop,Inheritance,Traits,PHP文档说明了以下关于覆盖特性属性的内容: 如果特征定义了属性,那么类就不能定义属性 使用相同的名称,除非它兼容(相同的可见性和 初始值),否则将发出致命错误 但是,在抽象类中使用trait时,可以在扩展该抽象类的类中重写trait中定义的属性: 因为出于所有目的,B没有使用属性trait。A使用它来组成抽象类 B对A使用的特征没有可见性。如果要在B上执行class\u uses,则会得到一个空数组,和 由于B没有使用任何trait,因此该类可以自由重写任何继承的属性 A是一个抽象类的事实与此
因为出于所有目的,B
没有使用属性trait
。A
使用它来组成抽象类
B
对A
使用的特征没有可见性。如果要在B
上执行class\u uses
,则会得到一个空数组,和
由于B
没有使用任何trait,因此该类可以自由重写任何继承的属性
A
是一个抽象类的事实与此无关。任何扩展了使用traits组成的类的类都会发生同样的行为。我有一些疑问@yivi没有任何抽象类,我在B中使用了trait,没有任何重新声明,它是有效的。@Sooraj在最后一个示例中,您没有覆盖属性的初始值。初始(预实例化)值相同。当\uu construct()
运行时,您只需在实例化时分配一个新的。无论如何定义,属性都是一个变量。可以在实例化类后为其分配新值。同样,涉及抽象类也不相关。