如何在PHP中實(shí)現(xiàn)多繼承
trait是什么
trait是為了在PHP實(shí)現(xiàn)多繼承的一種實(shí)現(xiàn)機(jī)制。PHP使用extends實(shí)現(xiàn)繼承,本身是不能繼承多個(gè)類的。同一類可以實(shí)現(xiàn)多個(gè)trait類。更多關(guān)于PHP面試題,請點(diǎn)擊查看。
優(yōu)先級
如果當(dāng)前類和trait存在同名方法,當(dāng)前類的優(yōu)先級是高于trait類中同名方法。
trait?A
{
????public?function?show()
????{
????????"traitA-show"
????}
}
class?B?{
????use?A;
????public?function?show()
????{
????????"B-show"
????}
}
//?output
//?B-show
如果當(dāng)前類繼承了一個(gè)基類,并且實(shí)現(xiàn)了一個(gè)trait類。三則中存在同名方法,其優(yōu)先級為:當(dāng)前類->trait類->基類。 如果兩個(gè) trait 都插入了一個(gè)同名的方法,如果沒有明確解決沖突將會產(chǎn)生一個(gè)致命錯(cuò)誤。需要使用指定別名來全部實(shí)現(xiàn)trait類中的方法。
class?A
{
????//?該方法只會實(shí)現(xiàn)指定的方法,trait類中的其他方法將會被排除。
????use?TraitA,?TraitB?{
????????A:function1?insteadof?a;
????????B:function1?insteadof?b;
????}
????
????//?給實(shí)現(xiàn)的trait類中,方法沖突的都指定一個(gè)別名。
????use?TraitA,?TraitB?{
????????A:function1?as?af1;
????????A:function2?as?af2;
????????B:function1?as?bf1;
????????B:function2?as?bf2;
????}
}
指定實(shí)現(xiàn)trait類中的方法權(quán)限。
class?A
{
????use?TraitA?{
????????A:function1?as?private?af1;
????}
}
trait類本身也可以集成其他的trait類。
trait?A?{
}
trait?B?{
}
trait?C?{
????use?A,?B;
}
為了對使用的類施加強(qiáng)制要求,trait 支持抽象方法的使用。支持 public 、protected 和 private 方法。PHP 8.0.0 之前, 僅支持 public 和 protected 抽象方法。
trait?Hello?{
????public?function?sayHelloWorld()?{
????????echo?'Hello'.$this->getWorld();
????}
????abstract?public?function?getWorld();
}
class?MyHelloWorld?{
????private?$world;
????use?Hello;
????public?function?getWorld()?{
????????return?$this->world;
????}
????public?function?setWorld($val)?{
????????$this->world?=?$val;
????}
}
Traits 可以定義靜態(tài)變量、靜態(tài)方法和靜態(tài)屬性。自 PHP 8.1.0 起,棄用直接在 trait 上調(diào)用靜態(tài)方法或者訪問靜態(tài)屬性。靜態(tài)方法和屬性應(yīng)該僅在使用了 trait 的 class 中訪問。
trait?StaticExample?{
????public?static?$name?=?"john";
????public?static?function?doSomething()?{
????????return?'Doing?something';
????}
}
class?Example?{
????use?StaticExample;
}
Example::name;
Example::doSomething();
Trait 同樣可以定義屬性。Trait 定義了一個(gè)屬性后,類就不能定義同樣名稱的屬性,否則會產(chǎn)生 fatal error。有種情況例外:屬性是兼容的(同樣的訪問可見度、初始默認(rèn)值)。
trait?PropertiesTrait?{
????public?$same?=?true;
????public?$different?=?false;
}
class?PropertiesExample?{
????use?PropertiesTrait;
????public?$same?=?true;
????public?$different?=?true;?//?致命錯(cuò)誤
}
評論
圖片
表情
