摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復(fù)用技術(shù),為的單繼承限制提供了一套靈活的代碼復(fù)用機制。下面把的代碼做一個修改以上代碼會輸出??梢钥闯鰞?yōu)先級的順序為,當(dāng)前類的優(yōu)先級基類。
??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了??上г陧椖恐袕膩頉]有用過。
??Trait看上去既像類又像接口,其實都不是,Trait可以看做類的部分實現(xiàn),可以混入一個或多個現(xiàn)有的PHP類中,其作用有兩個:表明類可以做什么;提供模塊化實現(xiàn)。Trait是一種代碼復(fù)用技術(shù),為PHP的單繼承限制提供了一套靈活的代碼復(fù)用機制。
為什么使用TraitPHP語言使用一種典型的單繼承模型,在這種模型中,我們先編寫一個通用的根類,實現(xiàn)基本的功能,然后擴展這個根類,創(chuàng)建更具體的子類,直接從父類繼承實現(xiàn)。這叫做繼承層次結(jié)構(gòu),很多編程語言都使用這個模式。大多數(shù)時候這種典型的繼承模型能夠良好運作,但是如果想讓兩個無關(guān)的PHP類具有類似的行為,應(yīng)該怎么做呢?
Trait就是為了解決這種問題而誕生的。Trait能夠把模塊化的實現(xiàn)方式注入多個無關(guān)的類中,從而提高代碼復(fù)用。
簡單使用
trait Member { public function info() { echo "this is trait"; } } class ShowMember { use Member; } $Member = new ShowMember(); $Member->info();
以上代碼會輸出this is trait,從這里可以看出Trait的使用方法很簡單,即使用use關(guān)鍵字??赡苣阋呀?jīng)注意到,命名空間和Trait使用的都是use關(guān)鍵字,不同之處在于導(dǎo)入位置,命名空間在類的定義體外導(dǎo)入,而Trait在類的定義體內(nèi)導(dǎo)入。
優(yōu)先級
當(dāng)一個類繼承的基類,跟使用的Trait有相同的函數(shù)名稱時,應(yīng)該是哪一個優(yōu)先呢,下面我們來看一看。
trait Member { public function info() { echo "this is trait"; } } class BaseMember { public function info() { echo "this is base"; } } class ShowMember extends BaseMember { use Member; } $Member = new ShowMember(); $Member->info();
以上代碼會輸出this is trait。可以看出,當(dāng)繼承的基類與Trait有相同的函數(shù)時,Trait的優(yōu)先級是比基類要高的。下面把Trait的代碼做一個修改
trait Member { public function info() { parent::info(); echo "this is trait"; } } class BaseMember { public function info() { echo "this is base"; } } class ShowMember extends BaseMember { use Member; } $Member = new ShowMember(); $Member->info();
以上代碼會輸出this is basethis is trait。同樣可以看出Trait的優(yōu)先級比基類要高,并且可以再Trait中繼承基類的函數(shù)。下面再把代碼做一個修改。
trait Member { public function info() { echo "this is trait"; } } class BaseMember { public function info() { echo "this is base"; } } class ShowMember extends BaseMember { use Member; public function info() { echo "this is show"; } } $Member = new ShowMember(); $Member->info();
以上代碼會輸出this is show。可以看出優(yōu)先級的順序為,當(dāng)前類的優(yōu)先級》Trait》基類。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29375.html
摘要:命名沖突如果使用了多個并且多個中的命名有重復(fù),那么這個時候就會產(chǎn)生一個致命的錯誤。避免的沖突引起的錯誤。但是中的屬性跟方法,如果需要被外部的類使用的話,必須為,即使是也是不能被外部的類所使用的。 前面我們介紹了Trait的基本使用,下面來介紹下Trait比較復(fù)雜的用法 使用多個Trait trait Member { public function info() { ...
摘要:新特性掌握的引入,可以擴展的內(nèi)容,使在某種形式上實現(xiàn)了多重繼承,更加靈活不能被實例化示例代碼需要注意的是,的繼承順序來自當(dāng)前類的成員覆蓋了的方法,而則覆蓋了被繼承的方法當(dāng)多個被同一個類使用的時候,會出現(xiàn)方法沖突的情況,使用關(guān)鍵詞解決示 PHP 5.4新特性 掌握 traits trait的引入,可以擴展class的內(nèi)容,使class在某種形式上實現(xiàn)了多重繼承,更加靈活 t...
摘要:關(guān)于作者程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事和前端開發(fā),使用和,端使用混合式開發(fā)。和組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和類相關(guān)典型問題。它為傳統(tǒng)繼承增加了水平特性的組合也就是說,應(yīng)用的幾個之間不需要繼承。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和...
摘要:個人網(wǎng)站最近剛寫了一個手機在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈?zhǔn)秸{(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:...
摘要:說明中經(jīng)常使用的反射特性來設(shè)計代碼,本文主要學(xué)習(xí)的反射特性,來提高寫代碼時的設(shè)計質(zhì)量。提供一套檢測的兩個工具包和,類似于探針一樣的東西來探測這些一等公民。限于篇幅,下篇再聊下反射。 說明:Laravel中經(jīng)常使用PHP的反射特性來設(shè)計代碼,本文主要學(xué)習(xí)PHP的反射特性,來提高寫代碼時的設(shè)計質(zhì)量。PHP提供一套檢測class, interface, trait, property, me...
閱讀 1244·2023-04-25 15:53
閱讀 2112·2021-11-19 09:40
閱讀 3505·2021-10-11 10:59
閱讀 2084·2019-08-30 15:55
閱讀 1968·2019-08-30 15:54
閱讀 2318·2019-08-29 13:03
閱讀 2771·2019-08-28 18:17
閱讀 1520·2019-08-27 10:51