什麼是Trait?
php 從 5.4版本開始支援 Trait 特性,和 Class 類別很相似,類別中一般的特性 Trait 都可以實現。 Trait 不是用來取代類別的,而是要去 “ 混入” 類別中。 Trait 是為了減少單一繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中重複使用方法集。 Trait 和類別組合的語意是定義了一種方式來減少複雜性,避免與傳統多繼承相關的典型問題。例如,需要同時繼承兩個抽象類,這是php語言不支援的功能, Trait 就是為了解決這個問題。或者可以理解為在繼承類別鏈中隔離了子類別繼承父類別的某些特性,相當於要用父類別的特性的時候,如果有 Trait 就優先調用 Trait 的成員。
Trait 的聲明
聲明類別需要使用class 關鍵字,聲明Trait 當然也要使用trait 關鍵字了, 類別有的特性Trait 一般都有。 Trait 支援 final、static 和 abstract 等修飾詞,所以 Trait 也支援抽象方法的使用、類別定義靜態方法,當然也可以定義屬性。但 Trait 無法像類別一樣使用 new 實例化,因為 Trait 就是用來混入類別中使用的,不能單獨使用。如果拿 Interface 和 Trait 類比, Trait 會有更多方便的地方。
簡單的 Trait 的宣告程式碼如下所示:
<?php //使用 trait 关键字申明一个 Trait,需要php5.4以上的版本 trait dome{ public $a = true; //声明成员属性 static $b = 1; //使用 static 关键字声明静态变量 function method1(){ } //声明成员方法 abstract public function method2(); //加入抽象修饰符,说明调用类必须实现它 } ?>
Trait 的基本使用
和類別不同的是, Trait 不能透過它本身來實例化對象,必須將其混入類別中使用。相當於將 Trait 中的成員複製到類別中,在應用類別時就像使用自己的成員一樣。如果要在類別中使用 Trait 。需要透過 use 關鍵字將 Trait 混入類別中。
其程式碼如下:
<?php //使用 trait 关键字申明一个 Trait,有两个成员方法 trait dome{ function method1(){ } //声明成员方法 function method2(){ } //声明成员方法 } class dome1{ //申明一个类,类中混入 Trait use dome; //使用 use 关键字在类中使用 dome } $obj = new dome1(); //实例化 dome1 对象 $obj->method1(); // 通过 dome1 对象,直接调用混入类 dome1 的成员方法 method1 $obj->method2(); // 通过 dome1 对象,直接调用混入类 dome1 的成员方法 method2 ?>
上例中透過 use 關鍵字,在dome1 類別中混入 dome 中的成員。也可以透過 use 關鍵字一次混入多個 Trait 一起使用。透過逗號分割,在 use 聲明列出多個 Trait ,可以都插入到一個類別中。需要注意的是,多個 Trait 之間同時使用難免會發生衝突。 php5.4 從語法方面帶入了相關的關鍵字語法 insteadof 。
範例程式碼如下所示:
<?php //使用 trait 关键字申明一个 Trait,有两个成员方法 trait dome1 { function fun() { echo "第一个 Trait 中的 fun 方法"; } } trait dome2 //这里名称相同就会有冲突 { function fun() { echo "第二个 Trait 中的 fun 方法"; } } class dome{ use dome1,dome2{ // dome2 中申明 dome1::fun insteadof dome2; // 申明使用 dome1 中的 fun 替换 } } $obj = new dome(); $obj->fun(); // 输出第一个 Trait 中的 fun 方法 ?>
不僅可以在類別中使用use 關鍵字將Trait 中的成員混入類別中,也可以在 Trait 中使用use關鍵字將另一個Trait 中的成員混入進來。這樣就形成了 Trait 之間的巢狀。為了對使用的類別施加強制要求, Trait 支援抽象方法的使用。如果在 Trait 中申明需要實作的抽象方法,這樣就能使使用它的類別必須先實作它,就像繼承抽象類,就必須實作類別中的抽象方法一樣。
更詳細的使用方式可以參考官方手冊。但剛開始學習 Trait 應該了解如下的重點:
1. Trait 會覆寫呼叫類別的父類別方法。
2. 從基底類別繼承的成員被 Trait 插入的成員所覆寫。優先順序是:來自目前類別的成員覆寫了 Trait 的方法,而 Trait 則覆寫了被繼承的方法。
3. Trait 不能像類別一樣使用 new 實例化物件。
4. 單一 Trait 可由多個 Trait 組成。
5. 在單一類別中,用 use 引入 Trait ,可以引入多個。
6. Trait 支援修飾詞,例如 final、static、abstract。
7. 可以使用 insteadof 及 as 運算子來解決 Trait之間的衝突。
8. 使用 as 語法也可以用來調整方法的存取控制。
【相關教學推薦】
2. 影片教學:trait功能的宣告與使用技巧:實作程式碼重複使用的類別方法集合
以上是什麼是Trait? php中Trait的申明與使用技巧分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!