摘要:語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承問題。是一組方法,可以包含在類中進行使用,單不可實例化。
PHP語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復。對于但繼承模式好還是多繼承模式好,不在本文探討范圍內。
為了解決PHP語言單繼承存在的不足,在PHP 5.4 中添加了新特性 trait,Trait 是一種代碼復用機制,為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。Trait 和 Class 組合的語義定義了一種減少復雜性的方式,避免傳統多繼承問題。
Trait是一組方法,可以包含在類中進行使用,單trait不可實例化。
trait Sharable { public function share($item) { return "share this item"; } }
你可以在其他類中包含這個trait
class Post { use Sharable; } class Comment { use Sharable; }
如果你實例化上面的類,就可以調用trait中的方法
$post = new Post; echo $post->share(""); // "share this item" $comment = new Comment; echo $comment->share(""); // "share this item"
解析上面例子是如何工作的:
例子中的Post 和 Comment 的實例都成功調用了方法share(),盡管類本身沒有share()方法,就是因為類中使用了trait Shareable.
trait的基本原理就是在運行時“復制和粘貼"了方法代碼,即將trait復制到Post和Comment類中,當你實例化對象時,share()方法就可以使用了。
總結:
Trait 無法如 Class 一樣使用 new 實例化
單個 Trait 可由多個 Trait 組成
在單個 Class 中,可以使用多個 Trait
使用trait時候應該堅決避免命名沖突,尤其是同時使用多個trait時。
上篇文章: 我在北京寫代碼 ,你在哪兒?
掃描關注微信公眾號:專注PHP學習
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22350.html
摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復用技術,為的單繼承限制提供了一套靈活的代碼復用機制。下面把的代碼做一個修改以上代碼會輸出。可以看出優先級的順序為,當前類的優先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了。可惜在項目中從來沒有用過。 ??Trait看...
摘要:關于作者程序開發人員,不拘泥于語言與技術,目前主要從事和前端開發,使用和,端使用混合式開發。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。它為傳統繼承增加了水平特性的組合也就是說,應用的幾個之間不需要繼承。 關于作者 程序開發人員,不拘泥于語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs,App端使用Apicloud混合式開發。合適和...
摘要:是一種為類似的單繼承語言而準備的代碼復用機制。因為中的變量環境是基于函數的,所以會輸出博客鏈接代碼復用機制,本文后續如有更新將會在博客更新。 提到 php 的代碼復用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現代碼復用呢? 自 PHP 5.4.0 起,PHP 實現了另外...
摘要:和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。隊列的目的是將耗時的任務延時處理,比如發送郵件,從而大幅度縮短請求和相應的時間。同樣的道理,根據引入不同的來完成對應的功能。 showImg(https://segmentfault.com/img/remote/1460000010868178); Trait 概念 在常規的 PHP 開發中,我們都習慣于先編寫一...
摘要:類與對象基本概念如果在之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。如果一個類被聲明為,則不能被繼承。命名空間通過關鍵字來聲明。 類與對象 基本概念 new:如果在 new 之后跟著的是一個包含有類名的字符串,則該類的一個實例被創建。如果該類屬于一個名字空間,則必須使用其完整名稱。 Example #3 創建一個實例 ...
閱讀 2663·2021-11-23 09:51
閱讀 1649·2021-11-22 13:54
閱讀 2789·2021-11-18 10:02
閱讀 943·2021-08-16 10:57
閱讀 3559·2021-08-03 14:03
閱讀 1879·2019-08-30 15:54
閱讀 3534·2019-08-23 14:39
閱讀 606·2019-08-23 14:26