作用:解決程式碼複用問題,解決單一繼承問題
與普通類的異同
- 相同點
- trait 能夠像普通的類一樣定義屬性,方法(包含抽象的、靜態的)
- trait 引入到基類裡面,其子類裡面也能訪問trait裡面的屬性和方法。
- 不用點
- trait不用例項化就能訪問定義的普通方法以及屬性。
- trait裡面不能定義建構函式。
細節
- Trait中的方法或屬性會覆蓋 基類中的同名的方法或屬性,而本類會覆蓋Trait中同名的屬性或方法
- 一個類可以組合多個Trait,透過逗號相隔
- 解決不同trait同名衝突,使用別名
<?php
Trait TraitOne {
public $propertyOne = 'argumentOne';
public function sayHello()
{
return 'My trait one';
}
}
Trait TraitTwo {
public function sayHello()
{
return 'My Trait Two';
}
}
class MyClass {
use TraitOne, TraitTwo {
TraitTwo::sayHello insteadof TraitOne; //指定要使用的trait
Traittwo::sayHello as twoSayHello; //同方法名的trait設定別名
}
public function traitMethodValue()
{
return $this->twoSayHello(); //呼叫trait別名方法
}
}
$myClass = new MyClass();
echo $myClass->twoSayHello();
class MyClassSon extends MYClass {
}
$myClass = new MyClassSon();
echo $myClass->twoSayHello(); //traits方法可以被繼承
複製程式碼,即可執行。 謝謝你的瀏覽,如有錯誤,歡迎指正哈!!!
本作品採用《CC 協議》,轉載必須註明作者和本文連結