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