摘要:的使用場景如以下應用場景我是人,我能吃飯降龍十八掌降龍十八掌類與類都繼承于,都有共同的方法,顯然,我們不能將這個方法寫到類,不然隨便一個路人甲繼承了類,就擁有了技能。
在PHP5.4之前,PHP面向對象需要復用代碼的方式是使用類的繼承。但PHP只支持單繼承,在應對較復雜的業務邏輯中,單繼承就顯得捉襟見肘了。
trait的使用場景如以下應用場景:
class Person { public function eat() { echo "我是人,我能吃飯
"; } } class GuoJing extends Person { public function kungfu() { echo "降龍十八掌!
"; } } class XiaoFeng extends Person { public function kungfu() { echo "降龍十八掌!
"; } }
Guojing 類 與 XiaoFeng 類都繼承于Person,都有共同的 Kungfu 方法,顯然,我們不能將這個 Kungfu 方法寫到 Person 類,不然隨便一個路人甲繼承了 Person 類,就擁有了 Kungfu 技能。
用Trait就能解決此問題:
"; } } class Person { public function eat() { echo "我是人,我能吃飯
"; } } class GuoJing extends Person { use Tool; } class XiaoFeng extends Person { use Tool; } $guojing = new GuoJing(); $xiaofeng = new XiaoFeng(); $guojing->kungfu(); $xiaofeng->kungfu();
結果如下:
降龍十八掌! 降龍十八掌!方法/屬性的重寫
如果Trait類、基類和本類中的方法或屬性同名,最終會以哪個為準?
"; } } class Person { public function eat() { echo "我是人,我能吃飯
"; } public function kungfu() { echo "不是每個人都會功夫
"; } } class GuoJing extends Person { use Tool; public function kungfu() { echo "除了降龍十八掌,我還懂九陰真經!
"; } } class XiaoFeng extends Person { use Tool; } $guojing = new GuoJing(); $guojing->kungfu();
結果:
除了降龍十八掌,我還懂九陰真經!
注釋本類的 kungfu 方法,得出的結果是:
降龍十八掌!
組合多個trait當方法或屬性同名時,當前類中的方法會覆蓋 trait的 方法,而 trait 的方法又覆蓋了基類中的方法。
多個trait有同名的方法/屬性時,會報錯:
"; } } trait Skill { public function kungfu() { echo "渾厚的內力修為
"; } } class GuoJing { use Tool, Skill; } $guojing = new GuoJing(); $guojing->kungfu();
Fatal error: Trait method kungfu has not been applied, because there are collisions with other trait methods on GuoJing
解決方式:使用insteadof和as來解決沖突
insteadof: 使用某個方法替代另一個
as: 給方法取別名
"; } } trait Skill { public function kungfu() { echo "渾厚的內力修為
"; } } class XiaoFeng { use Tool, Skill { Skill::kungfu insteadof Tool; Skill::kungfu as ability; } } $xiaofeng = new XiaoFeng(); $xiaofeng->ability();
渾厚的內力修為trait方法的訪問控制
as關鍵詞可以修改方法的訪問控制
"; } } class XiaoFeng { use Tool { Tool::kungfu as protected ability; // 修改方法的訪問控制并起別名 } } $xiaofeng = new XiaoFeng(); $xiaofeng->ability();
報錯:
Fatal error: Uncaught Error: Call to protected method XiaoFeng::ability() from contextTrait組合
Trait也能組合Trait,同時,Trait中支持抽象方法、靜態屬性、靜態方法。
"; } } trait Feature{ use Tool; abstract public function dream(); public static function character() { echo "磊落豪雄
"; } } class XiaoFeng { use Feature; public function dream() { echo "弄清楚:我是誰?
"; } } $xiaofeng = new XiaoFeng(); $xiaofeng->kungfu(); XiaoFeng::character(); $xiaofeng->dream();
結果:
降龍十八掌! 磊落豪雄 弄清楚:我是誰?源碼下載
源碼倉庫鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23291.html
摘要:年月日晚,成都地鐵一號線,手機上突然彈出來一條金庸去世的新聞。作為一個開發人員,我在金庸這十四部名著里看到的,是的江湖。金庸的這個武功設定,和公司的數字化轉型,向的轉型很像。 2018年10月30日晚,成都地鐵一號線,Jerry手機app上突然彈出來一條金庸去世的新聞。 Jerry識字很早,小學一年級就開始蹭我父親的《射雕英雄傳》看了。小時候,我爸工作的車間里有一位領導,退休后把自己家...
摘要:不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。 不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。最初我是想用借優秀的產品經理思維來做最棒程序員的這個標題,但想想還是要有同理心,技術同學平時和產品同學已經是相愛相殺了...
摘要:不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。 不久前,在團隊內部和大家做了一次分享,內容就是這次要講的用認知和人性來提升自己的技術水平,大家反響不錯,所以這次整理一下也分享給大家。最初我是想用借優秀的產品經理思維來做最棒程序員的這個標題,但想想還是要有同理心,技術同學平時和產品同學已經是相愛相殺了...
摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復用技術,為的單繼承限制提供了一套靈活的代碼復用機制。下面把的代碼做一個修改以上代碼會輸出。可以看出優先級的順序為,當前類的優先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了。可惜在項目中從來沒有用過。 ??Trait看...
摘要:關于作者程序開發人員,不拘泥于語言與技術,目前主要從事和前端開發,使用和,端使用混合式開發。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。它為傳統繼承增加了水平特性的組合也就是說,應用的幾個之間不需要繼承。 關于作者 程序開發人員,不拘泥于語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs,App端使用Apicloud混合式開發。合適和...
閱讀 3228·2021-11-11 16:55
閱讀 2477·2021-10-13 09:39
閱讀 2408·2021-09-13 10:27
閱讀 2162·2019-08-30 15:55
閱讀 3086·2019-08-30 15:54
閱讀 3132·2019-08-29 16:34
閱讀 1827·2019-08-29 12:41
閱讀 1071·2019-08-29 11:33