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