php 如何實現多繼承

2021-10-07 23:50:19 字數 2604 閱讀 2905

記得有一道面試題問php是否支援多繼承?

答案:不可以,只支援單繼承。

如何實現多繼承呢?

答案:可以使用 inte***ce 或 trait 實現 。

為什麼會想到這個問題,因為想到如果類繼承多個介面,然後他們之間還有相同的屬性和方法會引用誰的方法或屬性,誰又會被覆蓋?

總結:1.使用 inte***ce 宣告類不能被例項化,並且屬性必須是常量,方法不能有方法體

2.trait 宣告的類不能被例項化,由use引入,會覆蓋父類的相同屬性及方法,如果有多個use,那麼按順序下面的覆蓋最上面的相同的屬性及方法

介面是什麼?

使用介面(inte***ce),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

介面是通過 inte***ce 關鍵字來定義的,就像定義乙個標準的類一樣,但其中定義所有的方法都是空的。

介面中定義的所有方法都必須是公有,這是介面的特性。

trait是什麼?

看上去既像類又像介面,其實都不是,trait可以看做類的部分實現,可以混入乙個或多個現有的php類中,

其作用有兩個:表明類可以做什麼;提供模組化實現。

trait是一種**復用技術,為php的單繼承限制提供了一套靈活的**復用機制。

php介面inte***ce的使用

介面是什麼?

使用介面(inte***ce),可以指定某個類必須實現哪些方法,但不需要定義這些方法的具體內容。

介面是通過 inte***ce 關鍵字來定義的,就像定義乙個標準的類一樣,但其中定義所有的方法都是空的。

介面中定義的所有方法都必須是公有,這是介面的特性。

什麼時候用介面?

1、定規範,保持統一性;

2、多個平級的類需要去實現同樣的方法,只是實現方式不一樣

介面使用規範

介面不能例項化

介面的屬性必須是常量

介面的方法必須是public【預設public】,且不能有函式體

類必須實現介面的所有方法

乙個類可以同時實現多個介面,用逗號隔開

介面可以繼承介面【用的少】

<?php

phpinte***ce usb

// new usb(); // 介面不能例項化

// 類實現介面

class android implements usb

}inte***ce usba

inte***ce usbb

// 類可以同時實現多個介面

class mi implements usba,usbb

public function contact()

}?>

php中trait的使用

1、php中的trait是啥?

看上去既像類又像介面,其實都不是,trait可以看做類的部分實現,可以混入乙個或多個現有的php類中,其作用有兩個:表明類可以做什麼;提供模組化實現。trait是一種**復用技術,為php的單繼承限制提供了一套靈活的**復用機制。

2、php版本要求:

php5.4開始引入trait,其目的就是在於減少**的重複,增加**的復用性。

3、trait的使用場景:

試想這樣一種情況,當有乙個方法需要在很多的類中使用時,該怎麼處理?

通常一般的處理方式會是,寫乙個基礎類,在基類中實現這個方法,然後所有類都繼承這個基類。

這是一種處理方法,但不是最好的處理方式。通常採用繼承的情況是:幾個類具有很大的相似性。比如人作為乙個基類,學生、工人、等繼承「人」這個基類來擴充套件。

由此,trait的作用就出來了,trait 可以在多個類中使用。

4、trait如何使用:

1、先宣告乙個trait;

2、在類中使用use將該trait引入。

是不是非常簡單(手動逃)?需要注意的是trait的優先順序。

5、trait的優先順序

(敲黑板)從基類繼承的成員會被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

優先順序:自身方法》trait的方法》繼承的方法(就是這樣子的。)

<?php

trait

helloworld

}class

theworldisnotenough}$o

=new

theworldisnotenough()

;$o->

sayhello()

;//輸出是 hello universe!

?>

還有一點需要注意的是:多個trait的使用。

<?php

trait

hello

}trait

world

}class

myhelloworld}$o

=new

myhelloworld()

;$o->

sayhello()

;$o->

sayworld()

;$o->

sayexclamationmark()

;?>

總結:trait是一種**復用技術,為php的單繼承限制提供了一套靈活的**復用機制。

php使用 Trait 實現多繼承

trait中的方法會覆蓋 父類中的同名方法,而本類會覆蓋trait中同名方法 優先順序當前類 trait父類 trait中的屬性跟當前類不能相同有的屬性名,屬性名跟屬性值一樣除外,父類private屬性除外 當不同的trait中,卻有著同名的方法或屬性,會產生衝突,可以使用insteadof或 as...

php物件導向多繼承實現

在php物件導向概念程式設計中,乙個子類只能繼承乙個父類,但是從php5.4後新增traits實現 復用機制變向達到多繼承。trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用方法集。2 trait會覆蓋繼承的方法,當前類會覆蓋trait方法 class peop...

php實現多繼承 trait語法

自 php 5.4.0 起,php 實現了一種 復用的方法,稱為 trait。trait 是為類似 php 的單繼承語言而準備的一種 復用機制。trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。trait 和 class 組合的語義定義了一種減少...