站長資訊網
        最全最豐富的資訊網站

        總是在重復,氣抖冷,trait何時才能站起來?

        類中的某些成員如何才能被其他類使用呢?使用繼承的話,這繼承鏈也太長了,php提供了代碼復用技術trait。

        1.定義Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。trait可以使得單繼承語言拜托為了復用而不得不繼承的尷尬,讓面向對象變得更加純粹。

        2.基礎語法

        trait是一種類似class的關鍵字。

        <?php      trait Eat{         public $a=10;      //trait內允許有類的成員屬性(包括靜態屬性),成員方法(包括靜態方法)         public static $b=666;         //const c=3.14;       //trait內不允許有常量         protected $e;	//允許定義,但是實際不用         private $f;         public function getA()         {                echo $this->a,"<br>";         }         public static function getB()         {                echo self::$b,"<br>";         }     } ?>

        trait是用來實現代碼的復用的,不可以被實例化也不可以被繼承(不是類)。

        <?php    trait Eat{}   // $a=new Eat;//報錯   //calss A extends Eat{}//報錯 ?>

        3.trait的使用

        trait只是一段代碼的集合,使用時必須要使用use進行引用。

        <?php          trait Eat{         public $a=10;         public static $b=666;         //const c=3.14;         public function getA()         {                echo $this->a,"<br>";         }         public static function getB()         {                echo self::$b,"<br>";         }     }          class A{         use Eat;           public function getC()         {             echo $this->a,"<br>";         }     }      $boy=new A();     $boy->getC();     $boy->getA();     $boy->getB(); ?>

        一個類可以使用多個trait。

        <?php    trait A1{    }    trait A2{    }    class People{      use A1,A2;    } ?>

        4.trait使用的問題

        a.如果同時引入的多個trait中有同名屬性,那么會產生沖突。

        <?php     trait A1{        public $a=11;     }     trait A2{        public $a=22;     }      class A3{         use A1,A2;//不允許同名屬性         public function geta(){             echo $this->a;         }     }      $example=new A3();     ?>

        b.如果同時引入的多個trait中有同名方法,那么會產生沖突,有兩種方案解決如A3、A4。

        <?php     trait A1{        public $a=11;        public function eat(){            echo "A1中eat()方法","<br>";        }     }     trait A2{        public $b=22;        public function eat(){         echo "A2中eat()方法","<br>";       }     }      class A3{         use A1,A2{           A1::eat insteadOf A2; //A1中的eat替代A2中的eat         }     }     class A4{         use A1,A2{             A1::eat insteadOf A2;//A1中的eat替代A2中的eat             A2::eat as eat2;     //A2中的eat取別名eat2           }     }      $example=new A3();     $example->eat();     $example=new A4();     $example->eat2(); ?>

        c.同名覆蓋問題:如果類中有與引入的trait同名成員,會有不同處理:

        • 屬性:不允許重名,即類中不允許定義與trait中同名的成員屬性(靜態屬性也一樣)。

        • 方法:類覆蓋trait。

        d.繼承覆蓋問題:如果類中在使用trait的同時,也是繼承自父類,而trait中與父類中有同名方法,那么trait中將覆蓋父類同名方法;如果要訪問父類方法,可以在trait同名方法中使用parent關鍵字訪問父類同名方法。

        <?php     trait Eat{     public function eat(){         echo 'Eat::eat';     } }     class Human{     public function eat(){         echo 'Human::eat';     } } //子類繼承父類同時使用trait class Man extends Human{     use Eat; }  $m = new Man(); $m->eat(); ?>

        e.trait自己不能訪問,只是用來給其他類提供代碼復用的,因此允許類在使用trait時更高里面方法的訪問控制權:在as之后,使用目標訪問修飾限定符。

        <?php trait Eat{     private function show(){         echo 'eat';     } } class Human{     use Eat{         show as public eshow;				         //注意:as是用來設定別名的,雖然沒有同名show,但是系統認為show已經存在,所以必須別名,權限的更改的方法不是         //本尊     } } $h = new Human(); $h->eshow();								//eat ?>

        f.trait中可以使用抽象方法,用來規范使用類必須實現對應抽象方法:使用類要么為抽象類,要么就必須實現抽象方法。

        <?php    trait Eat{      public function eat();		//抽象方法    }    abstract class Human{			     use Eat;					//抽象類:可以不實現抽象方法    }     class Animal{     use Eat;     public function eat(){		//具體類:實現抽象方法         echo 'Animal::eat';	     }		 } ?>

        推薦:php教程,php視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲精品成人片在线观看精品字幕| 久久久WWW成人免费精品| 少妇人妻精品一区二区三区| 精品成人av一区二区三区| 国产精品青草久久久久婷婷| 无码国产精品一区二区免费模式| 精品无码久久久久久久久久| 精品久久久久久久| 国产精品日韩AV在线播放 | 久久精品国产福利国产秒| 精品国产a∨无码一区二区三区 | 精品国产乱码久久久久久郑州公司| 中文字幕一精品亚洲无线一区| 91人前露出精品国产| 精品久久久久久久| 国产小视频国产精品| 国产成人精品免费视频大| 国自产偷精品不卡在线| 亚洲日韩中文在线精品第一| 久久国产精品国语对白| 国产精品无码DVD在线观看| 青青青国产精品国产精品久久久久| 99久久精品国产麻豆| 国产精品视频二区不卡| 国产日韩精品中文字无码| 日韩精品中文字幕无码一区| 亚洲中文字幕无码久久精品1| 一本大道无码日韩精品影视| 无码国模国产在线无码精品国产自在久国产| 精品国产免费人成网站| 精品人妻伦九区久久AAA片69| 国产精品亚洲高清一区二区| 国产精品日韩欧美在线第3页| 国产精品久久久久一区二区三区| 99久久免费国产精品| 99久久精品费精品国产| 国产精品免费久久久久影院| 精品亚洲欧美中文字幕在线看| 久久久久亚洲精品中文字幕| 日韩午夜高清福利片在线观看欧美亚洲精品suv |