1. 如何在PHP中實現(xiàn)多繼承

        共 1927字,需瀏覽 4分鐘

         ·

        2022-06-11 19:22

        trait是什么

        trait是為了在PHP實現(xiàn)多繼承的一種實現(xiàn)機制。PHP使用extends實現(xiàn)繼承,本身是不能繼承多個類的。同一類可以實現(xiàn)多個trait類。更多關(guān)于PHP面試題,請點擊查看。

        優(yōu)先級

        1. 如果當前類和trait存在同名方法,當前類的優(yōu)先級是高于trait類中同名方法。
        trait?A
        {
        ????public?function?show()
        ????
        {
        ????????"traitA-show"
        ????}
        }

        class?B?{
        ????use?A;
        ????public?function?show()
        ????
        {
        ????????"B-show"
        ????}
        }
        //?output
        //?B-show
        1. 如果當前類繼承了一個基類,并且實現(xiàn)了一個trait類。三則中存在同名方法,其優(yōu)先級為:當前類->trait類->基類。
        2. 如果兩個 trait 都插入了一個同名的方法,如果沒有明確解決沖突將會產(chǎn)生一個致命錯誤。需要使用指定別名來全部實現(xiàn)trait類中的方法。
        class?A
        {
        ????//?該方法只會實現(xiàn)指定的方法,trait類中的其他方法將會被排除。
        ????use?TraitA,?TraitB?{
        ????????A:function1?insteadof?a;
        ????????B:function1?insteadof?b;
        ????}
        ????
        ????//?給實現(xiàn)的trait類中,方法沖突的都指定一個別名。
        ????use?TraitA,?TraitB?{
        ????????A:function1?as?af1;
        ????????A:function2?as?af2;
        ????????B:function1?as?bf1;
        ????????B:function2?as?bf2;
        ????}
        }
        1. 指定實現(xiàn)trait類中的方法權(quán)限。
        class?A
        {
        ????use?TraitA?{
        ????????A:function1?as?private?af1;
        ????}
        }
        1. trait類本身也可以集成其他的trait類。
        trait?A?{

        }

        trait?B?{

        }

        trait?C?{
        ????use?A,?B;
        }
        1. 為了對使用的類施加強制要求,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;
        ????}
        }
        1. Traits 可以定義靜態(tài)變量、靜態(tài)方法和靜態(tài)屬性。自 PHP 8.1.0 起,棄用直接在 trait 上調(diào)用靜態(tài)方法或者訪問靜態(tài)屬性。靜態(tài)方法和屬性應該僅在使用了 trait 的 class 中訪問。
        trait?StaticExample?{
        ????public?static?$name?=?"john";
        ????public?static?function?doSomething()?{
        ????????return?'Doing?something';
        ????}
        }

        class?Example?{
        ????use?StaticExample;
        }
        Example::name;
        Example::doSomething();
        1. Trait 同樣可以定義屬性。Trait 定義了一個屬性后,類就不能定義同樣名稱的屬性,否則會產(chǎn)生 fatal error。有種情況例外:屬性是兼容的(同樣的訪問可見度、初始默認值)。
        trait?PropertiesTrait?{
        ????public?$same?=?true;
        ????public?$different?=?false;
        }

        class?PropertiesExample?{
        ????use?PropertiesTrait;
        ????public?$same?=?true;
        ????public?$different?=?true;?//?致命錯誤
        }


        瀏覽 149
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 免费看黄色电影 | 欧美日韩国产精品爽爽 | 国产精品蜜臀 | 色婷婷中文在线 | 国产伦精品一区二区三区… |