国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP Trait代碼復(fù)用類與多繼承實現(xiàn)方法詳解

2024-05-05 00:09:41
字體:
供稿:網(wǎng)友

本文實例講述了PHP Trait代碼復(fù)用類與多繼承實現(xiàn)方法。分享給大家供大家參考,具體如下:

前言

眾所周知,一直以來PHP和很多語言一樣是單繼承的語言,但是常常在編碼過程中,我們需要在當(dāng)前類中使用兩個或兩個以上的其他類的方法,這種情況下繼承就不能實現(xiàn),而往往采用new方式實例化很多要用到的類,這樣就會很影響代碼的結(jié)構(gòu)和開發(fā)規(guī)范。于是Trait類誕生了,它是一種代碼復(fù)用的語法,能夠?qū)崿F(xiàn)一個類中引用多個其他類的方法。

一、概念

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

二、Trait類的使用

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

以下是原理解釋:

PHP,Trait,代碼復(fù)用,多繼承

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

三、Trait類的訪問控制

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

PHP,Trait,代碼復(fù)用,多繼承

四、Trait類的優(yōu)先級控制

Trait類與當(dāng)前使用類、繼承的基類之間的調(diào)用優(yōu)先級順序如下:
當(dāng)前使用類>Trait類>繼承的基類

當(dāng)存在同名方法時,會根據(jù)優(yōu)先級覆蓋掉同名的類。具體示例如下:

1、Trait類覆蓋基類

PHP,Trait,代碼復(fù)用,多繼承

2、當(dāng)前類覆蓋Trait類

PHP,Trait,代碼復(fù)用,多繼承

五、多個Trait類的沖突控制

在PHP中,如果當(dāng)前類use了兩個Trait類,同時兩個trait類都存在一個同名的方法,此時如果沒有明確解決沖突將會產(chǎn)生一個致命錯誤。
對于這種情況,PHP官方給出了兩個解決方案:
1、insteadof關(guān)鍵字:通過該關(guān)鍵字指定方法名沖突時該使用哪個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關(guān)鍵字:通過as關(guān)鍵字將同名方法指定為一個別名,且僅作用于當(dāng)前類中。示例如下:

use A, B {  B::a as c; //聲明B類的a方法為c,作用于該類  A::b as d; //聲明A類的b方法為d,作用于該類}

六、與繼承、直接實例化的區(qū)別

對于當(dāng)前一個類需要用到另一個或多個類的方法的情況,我們一般會想到的方式有繼承、直接實例化另外一個或多個類等等的方法,下面來對比一下這些方法和Trait類的區(qū)別:
1、繼承方式:對于繼承,可以完美地復(fù)用另一個類的一些方法,但是對于需要復(fù)用多個類的方法時,PHP是不支持多繼承的,而且只能訪問public和protected方法;
2、與直接實例化的區(qū)別:我們也可以在當(dāng)前類中直接實例化要用到的A類與B類,但是這種方法在控制訪問范圍反面,只允許訪問A、B類中public的方法;
3、使用Trait類則完全將A、B兩個類的方法導(dǎo)入到當(dāng)前類中,可以視為當(dāng)前類的一部分,唯一區(qū)別是可以存在于當(dāng)前類同名的方法,此時由優(yōu)先級順序來控制。

補充: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();

輸出結(jié)果:

hello  world
PHP

希望本文所述對大家PHP程序設(shè)計有所幫助。


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 五大连池市| 泰兴市| 浦东新区| 新兴县| 突泉县| 怀来县| 辉南县| 临朐县| 东兰县| 隆德县| 嘉义市| 临潭县| 钦州市| 饶平县| 醴陵市| 靖宇县| 瓮安县| 蓝山县| 大兴区| 唐山市| 内黄县| 云南省| 宜都市| 轮台县| 望奎县| 通江县| 攀枝花市| 富平县| 福贡县| 百色市| 东平县| 武陟县| 津南区| 麻城市| 白水县| 永泰县| 桐柏县| 开鲁县| 承德县| 班玛县| 城固县|