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