99久久国产露脸精品麻豆,欧美日韩精品小说,亚洲免费在线美女视频,国产三级中文字幕,91极品国产情侣高潮对白,国产亚洲一区二区三区不卡片,欧美jizz精品欧美性,久久国产精品久久国产片

PHP中的trait詳解

袁志蒙 5499次瀏覽

摘要:Trait是什么?1.trait是為單繼承語言量身定制的代碼復用機制; 2.之前可以通過函數或類來實現代碼復用; 3.trait可以簡單的理解為一個類方法的集合,工作在父類與子類之間; 4.但是trait不僅僅局限于方法集合,還支持抽象,靜態與屬性...

一、Trait是什么?

trait是php5.4以后新增加的一個功能,可以將多個類中,共用的一些屬性和方法提取出來做來公共trait類,就像是裝配汽車的配件,如果你的類中要用到這些配件,就直接用use導入就可以了,相當于把trait中的代碼復制到當前類中.


二、Trait類的使用

簡單地講,Trait就是一種不同于繼承的語法,定義一個trait類,在其他類中使用它則是采用use關鍵字,有點類似于命名空間的用法,但是含義不同。use關鍵字在一個類中引入Trait類后,相當于require或include了一段代碼進來,不同之處在于use的Trait類與當前類是可以看做同一個類的,即當前類可以用$this關鍵字調用Trait類的方法。

簡單例子:

//創建triat類Test1
trait Test1{
	public $name = 'YzmCMS';
	public function hello1(){
		return 'Test1::hello1()';
	}
}

//創建triat類Test2
trait Test2{
	function hello2(){
		return 'Test2::hello2()';
	}
}

//創建Demo1類
class Demo1{
	use Test1, Test2;  //引入Trait類
	public function demo(){
		return 'Demo1::demo()';
	}
}


$obj = new Demo1;
echo $obj->hello1(); //訪問trait類Test1中的hello1()
echo '<br>';
echo $obj->name; //訪問ttrait類Test1中的$name屬性
echo '<br>';
echo $obj->hello2(); //訪問ttrait類Test1中的hello2()

可以看出當前類可以簡單地use兩個Trait類,并調用其中的方法,而不僅限于繼承,只能使用一個父類的方法。


三、Trait類的訪問控制

我們知道,繼承的方式,如果基類是private修飾控制的,則子類是無法調用的。但是Trait不一樣,因為它類似于Require到當前類中了,所以不管是public、protected或private都是可以在本類中直接使用的


四、Trait類的優先級控制

Trait類與當前使用類、繼承的基類之間的調用優先級順序如下:

當前使用類>Trait類>繼承的基類


五、多個Trait類的沖突控制

在PHP中,如果當前類use了兩個Trait類,同時兩個trait類都存在一個同名的方法,此時如果沒有明確解決沖突將會產生一個致命錯誤。

例子:

trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}
 
trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}
 
class Aliased {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }  //這里千萬不要加分號 ;
}
$a = new Aliased();
$a->bigTalk();  //A
$a->talk();     //B
$a->smallTalk();  //b

1、insteadof關鍵字:通過該關鍵字指定方法名沖突時該使用哪個Trait類的方法,即:

如果C類use了A、B兩個Trait類,且A、B兩個類都存在a、b方法,則在C類use A、B類時使用insteadof聲明沖突的解決方法即可:

use A, B {
    B::a insteadof A; //a方法沖突時使用B類的a方法而不使用A類的a方法
    A::b insteadof B; //b方法沖突時使用A類的b方法而不使用B類的b方法
}

2、as關鍵字:通過as關鍵字將同名方法指定為一個別名,且僅作用于當前類中。示例如下:
use A, B {
    B::a as c; //聲明B類的a方法為c,作用于該類
    A::b as d; //聲明A類的b方法為d,作用于該類
}

六、與繼承、直接實例化的區別

對于當前一個類需要用到另一個或多個類的方法的情況,我們一般會想到的方式有繼承、直接實例化另外一個或多個類等等的方法,下面來對比一下這些方法和Trait類的區別:

1、繼承方式:對于繼承,可以完美地復用另一個類的一些方法,但是對于需要復用多個類的方法時,PHP是不支持多繼承的,而且只能訪問public和protected方法;

2、與直接實例化的區別:我們也可以在當前類中直接實例化要用到的A類與B類,但是這種方法在控制訪問范圍反面,只允許訪問A、B類中public的方法;

3、使用Trait類則完全將A、B兩個類的方法導入到當前類中,可以視為當前類的一部分,唯一區別是可以存在于當前類同名的方法,此時由優先級順序來控制。


隨機內容

表情

共1條評論
  • 網友評論:

    非常清楚,非常不錯,理解了,感謝大佬

    2020-09-09 09:59:04 回復

    點擊加載