在php5.4之前,php物件導向需要復用**的方式是使用類的繼承。但php只支援單繼承,在應對較複雜的業務邏輯中,單繼承就顯得捉襟見肘了。
如以下應用場景:
class person
}class guojing extends person
}class xiaofeng extends person
}
guojing 類 與 xiaofeng 類都繼承於person,都有共同的 kungfu 方法,顯然,我們不能將這個 kungfu 方法寫到 person 類,不然隨便乙個路人甲繼承了 person 類,就擁有了 kungfu 技能。
用trait就能解決此問題:
<?php
trait tool
}class person
}class guojing extends person
class xiaofeng extends person
$guojing = new guojing();
$xiaofeng = new xiaofeng();
$guojing->kungfu();
$xiaofeng->kungfu();
結果如下:
降龍十八掌!
降龍十八掌!
如果trait類、基類和本類中的方法或屬性同名,最終會以哪個為準?
<?php
trait tool
}class person
public function kungfu()
}class guojing extends person
}class xiaofeng extends person
$guojing = new guojing();
$guojing->kungfu();
結果:
除了降龍十八掌,我還懂九陰真經!
注釋本類的 kungfu 方法,得出的結果是:
降龍十八掌!
當方法或屬性同名時,當前類中的方法會覆蓋 trait的 方法,而 trait 的方法又覆蓋了基類中的方法。多個trait有同名的方法/屬性時,會報錯:
<?php
trait tool
}trait skill
}class guojing
$guojing = new guojing();
$guojing->kungfu();
解決方式:使用insteadof和as來解決衝突
<?php
trait tool
}trait skill
}class xiaofeng
}$xiaofeng = new xiaofeng();
$xiaofeng->ability();
渾厚的內力修為
<?php
trait tool
}class xiaofeng
}$xiaofeng = new xiaofeng();
$xiaofeng->ability();
報錯:
fatal error: uncaught error: call to protected method xiaofeng::ability() from context
trait也能組合trait,同時,trait中支援抽象方法、靜態屬性、靜態方法。
<?php
trait tool
}trait feature
}class xiaofeng
}$xiaofeng = new xiaofeng();
$xiaofeng->kungfu();
xiaofeng::character();
$xiaofeng->dream();
結果:
降龍十八掌!
磊落豪雄
弄清楚:我是誰?
原始碼倉庫鏈 我的讀書筆記 峰與谷
斯賓塞 詹森經典作品 峰與谷 一 在我們的工作和生活中,每個人都會遭遇高峰和低谷,這是人生的常態。二 高峰和低谷不僅是外部的順境和逆境,更是你內心深處的感受和變化。三 峰谷相連不分。今日逆境之智,換得他日逆境 今日逆境之智,換得他日順境。生活不可能是一成不變的,而且,一成不變的生活會讓你感到枯燥,讓...
千峰筆記 遞迴 棧與佇列 目錄遍歷
遞迴呼叫 乙個函式,呼叫了自身,稱為遞迴呼叫 遞迴函式 乙個會呼叫自身的函式 凡是迴圈能幹的事,遞迴都能幹 方式 寫出臨界條件 找這一次和上一次的關係 假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 求和def sum1 n sum 0 for x in range 1,n 1 s...
隨手記 共振峰的特性 與音高pitch
人聲的共振峰有乙個有意思的特性,每乙個母音都有對應的乙個共振峰,而且這個共振峰不隨音高 pitch 的改變而改變。我們可以用不同的音高去發出相同乙個母音。此時聲帶振動的頻率改變,但是共鳴腔不變。也可以用相同的音高去發出不同的母音,此時聲帶振動的頻率不變而共鳴腔的形狀改變。也就是說,無論你聲音高低,只...