中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP如何使用Trait實現復用類與多繼承

發布時間:2021-07-08 09:56:36 來源:億速云 閱讀:162 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“PHP如何使用Trait實現復用類與多繼承”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“PHP如何使用Trait實現復用類與多繼承”這篇文章吧。

具體如下:

前言

眾所周知,一直以來PHP和很多語言一樣是單繼承的語言,但是常常在編碼過程中,我們需要在當前類中使用兩個或兩個以上的其他類的方法,這種情況下繼承就不能實現,而往往采用new方式實例化很多要用到的類,這樣就會很影響代碼的結構和開發規范。于是Trait類誕生了,它是一種代碼復用的語法,能夠實現一個類中引用多個其他類的方法。

一、概念

PHP官方手冊對Trait的描述是:
Trait是為類似PHP的單繼承語言而準備的一種代碼復用機制。Trait為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用method。Trait和Class組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和Mixin類相關典型問題。
Trait和Class相似,但僅僅旨在用細粒度和一致的方式來組合功能。無法通過trait自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個Class之間不需要繼承。

二、Trait類的使用

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

以下是原理解釋:

PHP如何使用Trait實現復用類與多繼承

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

三、Trait類的訪問控制

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

PHP如何使用Trait實現復用類與多繼承

四、Trait類的優先級控制

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

當存在同名方法時,會根據優先級覆蓋掉同名的類。具體示例如下:

1、Trait類覆蓋基類

PHP如何使用Trait實現復用類與多繼承

2、當前類覆蓋Trait類

PHP如何使用Trait實現復用類與多繼承

五、多個Trait類的沖突控制

在PHP中,如果當前類use了兩個Trait類,同時兩個trait類都存在一個同名的方法,此時如果沒有明確解決沖突將會產生一個致命錯誤。
對于這種情況,PHP官方給出了兩個解決方案:
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兩個類的方法導入到當前類中,可以視為當前類的一部分,唯一區別是可以存在于當前類同名的方法,此時由優先級順序來控制。

補充:PHP多繼承示例

class Base{
  public function sayHello(){
    echo "hello ";
  }
}
trait SayWorld{
  public function sayHello(){
    parent::sayHello();
    echo "world".PHP_EOL;
  }
}
trait SayWorld2{
  public function sayHello2(){
    echo "PHP".PHP_EOL;
  }
}
class MyHelloWorld extends Base{
  use SayWorld,SayWorld2;
}
$s = new MyHelloWorld();
$s->sayHello();
$s->sayHello2();

輸出結果:

hello  world
PHP

以上是“PHP如何使用Trait實現復用類與多繼承”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安多县| 育儿| 葫芦岛市| 锡林郭勒盟| 高雄县| 营山县| 镇安县| 边坝县| 诸城市| 泽州县| 岱山县| 南溪县| 宁河县| 肇东市| 宜阳县| 谷城县| 宣武区| 民和| 淳安县| 孝感市| 会泽县| 石河子市| 霍林郭勒市| 田东县| 枞阳县| 涿鹿县| 谢通门县| 武隆县| 淄博市| 侯马市| 青海省| 孝昌县| 乌审旗| 长顺县| 全南县| 称多县| 上饶县| 临洮县| 镇江市| 惠州市| 清水县|