13161216443

您所在位置: 首頁> 學習課程> PHP培訓 | PHP基礎理解·類5-trait

PHP培訓 | PHP基礎理解·類5-trait

發布百知教育 來源:學習課程 2019-10-29

trait概述

trait可以看做是特殊的類,和普通的類區別在于兩點,一點是關鍵字不一樣,一點是traits不能實例化。


class normal_class
{
   屬性區域
   方法區域
}

trait special_class
{
   屬性區域
   方法區域
}

借助traits,實現橫向的多重繼承


類-繼承一節當中,已經說明,多重繼承有兩種方案,一種是縱向的(已使用范例說明),一種是橫向的,就是借助本節的trait來實現。


trait level1
{
   public function plus(){}
}

trait level2
{
   public function mul(){}
}

trait level3
{
   public function division(){}
}

trait level4
{
   public function sub(){}
}

class math
{
   use level1;
   use level2;
   use level3;
   use level4;
}


如范例,最終math類提供加減乘除功能,與類-繼承一節不同的是,使用trait,可以隨意組合,可以使用任意一個功能,也可以任意多個功能進行組合。需要注意的一點是,trait必須放到一個“容器”當中才能使用,如范例中的math,這也是概述中所描述的trait不能實例化。


這樣來看,trait才真正讓PHP實現了功能組件化,有趣的又是其本身并不具備功能。舉個樂高積木的例子,樂高提供了很多基礎的正方體,長方體,三棱柱等,這些零件可以單獨使用,也可以組合起來使用,trait和這些零件類似,但其不能單獨使用,必須先放到一個“容器”當中,然后才能使用,這里有一個不能忽略的步驟,將trait放入“容器”之中,不然trait無法使用,普通的類雖然不存在這樣的問題,但組合上面又不夠靈活。


同時使用trait和extend

trait fun1
{
   public function add()
   {
       echo "trait add \r\n";
   }
}

trait fun2
{
   public function add()
   {
       echo "fun2 add \r\n";
   }
}

class dad
{
   public function add()
   {
       echo "dad add \r\n";
   }
}

class son extends dad
{
   use fun1;
}

$obj = new son();
$obj->add();#trait add. trait會覆蓋dad

class grandson
{
   use fun1;
   use fun2;
}
$obj = new grandson();
$obj->add();#error trait當中不能出現重名


和繼承一樣,trait同樣存在同名覆蓋的問題,這里要說明是如果extends和trait同時存在,誰覆蓋誰的問題以及多個trait中存在同名時,覆蓋關系如何。


根據grandson的測試結果,所有的trait都在同一個作用域中,雖然可以使用多個trait來分割出多個不同的功能,理解上可以看成一個作用域被切割成了多個分離的部分,在“容器”中,又將分離的部分組合到了一起。


trait中的同名處理

trait fun1
{
   public function add(){}
   public function sub(){}
}

trait fun2
{
   public function add(){}
   public function sub(){}
}

class son
{
   use fun1,fun2{
       fun1::add insteadof fun2;
       fun2::sub insteadof fun1;
       fun2::sub as f;
   }
}


如上范例,trait fun1和fun2中都定義了add()和sub(),在son“容器”中拼裝了fun1,fun2,使用insteadof來指定由誰覆蓋誰,上例中由fun1::add(fun1中的add)覆蓋fun2中的同名方法。as僅僅只是用來起別名而已,別名的使用就是為了簡化。


PHP培訓:http://www.akpsimsu.com/php2019



上一篇:大數據培訓 | 大數據篇-Hadoop框架詳解

下一篇:應屆生去公司找個Java程序員的職位需要什么技能?

相關推薦

www.akpsimsu.com

有位老師想和您聊一聊

關閉

立即申請