Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么可以重写父类中使用的trait中定义的属性的初始值?_Php_Oop_Inheritance_Traits - Fatal编程技术网

Php 为什么可以重写父类中使用的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是一个抽象类的事实与此

PHP文档说明了以下关于覆盖特性属性的内容:

如果特征定义了属性,那么类就不能定义属性 使用相同的名称,除非它兼容(相同的可见性和 初始值),否则将发出致命错误

但是,在抽象类中使用trait时,可以在扩展该抽象类的类中重写trait中定义的属性:


因为出于所有目的,
B
没有使用
属性trait
A
使用它来组成抽象类

B
A
使用的特征没有可见性。如果要在
B
上执行
class\u uses
,则会得到一个空数组,和

由于
B
没有使用任何trait,因此该类可以自由重写任何继承的属性

A
是一个抽象类的事实与此无关。任何扩展了使用traits组成的类的类都会发生同样的行为。

我有一些疑问@yivi没有任何抽象类,我在B中使用了trait,没有任何重新声明,它是有效的。@Sooraj在最后一个示例中,您没有覆盖属性的初始值。初始(预实例化)值相同。当
\uu construct()
运行时,您只需在实例化时分配一个新的。无论如何定义,属性都是一个变量。可以在实例化类后为其分配新值。同样,涉及抽象类也不相关。