1. 程式人生 > >php中的Trait特性技術詳解

php中的Trait特性技術詳解

/**
 * trait 程式碼複用機制
 * 1.trait本意是特徵,就是給當前類新增一些新特徵;
 * 2.而這些新功能,尚不具備形成一個功能完善的類,並且也不方便用一個類進行包裝
 * 3.類似於類的外掛庫,用來擴充當前類的功能,或者在不修改父類功能的前提下,實現功能動態更新
 * 4.它工作在當前類與父類之間(如果有),可覆寫同名父類成員
 * 5.trai類之間可以相互組合,也可進行訪問控制
 * 6.trait類中也可以有屬性(7.0前類中不允許有與之同名屬性,7.0後可以,但必須同性同值)
 *      所謂同性同值: 訪問限制相同,初始值相同
 * 7.trait類儘管也使用與類一樣的語法,但卻不是類,所以不能例項化
 * 8.trait類是使用use關鍵字將自身程式碼插入到當前工作類中的
 * 9.trait類中的同名成員衝突可以使用替換(insteadof)和別名(as)來解決
 */

 

//優先順序
//Bus > trait > Auto

trait Func1
{
    //保養
    public function care()
    {
        return '我是Func1中的保養方法';
    }
    //駕駛
    public function drive()
    {
        return '支援無人駕駛';
    }
    //交能事故處理
    public function accident()  //['æksədənt]
    {
        return '汽車會自動報警,你就安靜的坐在車裡等警察來吧!';
    }
}

trait Func2
{
    //燃料能源
    public function fuel()
    {
        return '新能源汽車';
    }

    //交能事故處理
    public function accident()
    {
        return '只要不起火,電池還能繼續使用的,放心吧!';
    }
}

class Auto
{
    public $brand;
    public $purpose;

    public function __construct($brand,$purpose)
    {
        $this->brand = $brand ;
        $this->purpose = $purpose ;
    }

    //保養
    public function care()
    {
        return '請到授權的專業4s店進行保養';
    }

}


class Bus extends Auto
{
    //匯入trait類庫: Func1, Func2,並宣告命名衝突解決方案
//    use Func1;
//    use Func2;
     use Func1,Func2 {
         //當直接訪問accident()時,用Func1中的同名方法替換Func2同名方法
         Func1::accident insteadof Func2 ;

         //為防止Func2中的accident()方法無法呼叫,可以使用別名,來解決衝突
         Func2::accident as Aaccident;
     }

    //保養
    public function care()
    {
        return '我是Bus中的保養方法';
    }

}

$bus = new Bus('賓士','私家車');

echo $bus->brand.'<br>';
echo $bus->purpose.'<br>';

echo $bus->drive().'<br>';
echo $bus->care().'<br>';

echo '<hr>';

echo $bus->accident().'<br>';
//使用別名訪問 Func2中的 accident()方法: 別名是: Aaccident
echo $bus->Aaccident().'<br>';