摘要:命名沖突如果使用了多個并且多個中的命名有重復,那么這個時候就會產生一個致命的錯誤。避免的沖突引起的錯誤。但是中的屬性跟方法,如果需要被外部的類使用的話,必須為,即使是也是不能被外部的類所使用的。
使用多個Trait
trait Member { public function info() { echo "this is trait,"; } } trait Admin { public function show() { echo "this is admin,"; } } class ShowMember { use Member,Admin; } $Member = new ShowMember(); $Member->info(); $Member->show();
直接使用,逗號隔開,以上程序將會輸出this is trait,this is admin,。
命名沖突
如果使用了多個Trait,并且多個Trait中的命名有重復,那么這個時候就會產生一個致命的錯誤。為了正確的使用這些Trait,我們需要用insteadof來調用這些同名的方法。
trait Member { public function info() { echo "this is member info,"; } public function show() { echo "this is member show,"; } } trait Admin { public function info() { echo "this is admin info,"; } public function show() { echo "this is admin show,"; } } class ShowMember { use Member,Admin{ Member::info insteadof Admin;//使用 Member 的info 方法來替代 Admin 的info方法 Admin::show insteadof Member;//使用 Admin 的show 方法來替代 Member 的show方法 } } $Member = new ShowMember(); $Member->info(); $Member->show();
以上程序將會輸出this is member info,this is admin show,。這個時候使用了insteadof來聲明了,我需要使用哪個Trait中的方法。避免的沖突引起的錯誤。
Trait的抽象成員
Trait和普通的類一樣,也是成員變量的,也可以定義抽象方法來強制要求。
trait Member { public function info() { echo "this is member info,"; } abstract public function show(); } class ShowMember { use Member; public function show() { // TODO: Implement show() method. } } $Member = new ShowMember(); $Member->info();
Trait的靜態成員
Trait 同樣是可以靜態成員變量的
trait Member { public function info() { echo "this is member info,"; } public static $_a = 1; public function show() { echo self::$_a; } } class ShowMember { use Member; } $Member = new ShowMember(); $Member->show();//會輸出1 echo $Member::$_a;//也會輸出1
Trait的訪問修飾符
上面很多例子可以看到 對Trait的方法,跟屬性都是加有 public訪問修飾符,是不是就意味著,Trait也可以使用訪問修飾符呢,答案是肯定的。但是Trait中的屬性跟方法,如果需要被外部的類使用的話,必須為public,即使是protected也是不能被外部的類所使用的。那么如果我需要在外部的類中對該方法進行私有化怎么辦呢,下面來看一個列子
trait Member { public static function show() { echo "show"; } } class ShowMember { use Member{ show as private; //將Trait中的show方法私有化 } public function OutShow() { Member::show(); } } $Member = new ShowMember(); $Member->OutShow(); //$Member::show(); //這個時候直接調用 show方法那么會造成致命錯誤
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29374.html
摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復用技術,為的單繼承限制提供了一套靈活的代碼復用機制。下面把的代碼做一個修改以上代碼會輸出。可以看出優先級的順序為,當前類的優先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了。可惜在項目中從來沒有用過。 ??Trait看...
摘要:新特性掌握的引入,可以擴展的內容,使在某種形式上實現了多重繼承,更加靈活不能被實例化示例代碼需要注意的是,的繼承順序來自當前類的成員覆蓋了的方法,而則覆蓋了被繼承的方法當多個被同一個類使用的時候,會出現方法沖突的情況,使用關鍵詞解決示 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...
閱讀 1462·2021-09-02 13:57
閱讀 1878·2019-08-30 15:55
閱讀 2416·2019-08-30 15:54
閱讀 2254·2019-08-30 15:44
閱讀 2740·2019-08-30 13:18
閱讀 487·2019-08-30 13:02
閱讀 651·2019-08-29 18:46
閱讀 1670·2019-08-29 11:25