摘要:和組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和類相關(guān)典型問題。隊列的目的是將耗時的任務(wù)延時處理,比如發(fā)送郵件,從而大幅度縮短請求和相應(yīng)的時間。同樣的道理,根據(jù)引入不同的來完成對應(yīng)的功能。
Trait 概念
在常規(guī)的 PHP 開發(fā)中,我們都習(xí)慣于先編寫一個通用的基類,實現(xiàn)基本的功能,然后擴(kuò)展這個基類,創(chuàng)建更具體的子類,直接從父類繼承實現(xiàn)。很多編程語言都使用這個繼承層次結(jié)構(gòu)模式。大多數(shù)時候這種典型的繼承模型能夠良好運(yùn)作,但是如果想讓兩個無關(guān)的PHP 類具有類似的行為,而不是采用繼承的模式,應(yīng)該怎么做呢?
Trait 就是為了解決這種問題而誕生的。Trait能夠把模塊化的實現(xiàn)方式注入多個無關(guān)的類中,從而提高代碼復(fù)用,符合 DRY(Don’t Repeat Yourself)原則。
自 PHP 5.4.0 起,PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為 trait。
Trait 是為類似 PHP 的單繼承語言而準(zhǔn)備的一種代碼復(fù)用機(jī)制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用 method。Trait 和 Class 組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類相關(guān)典型問題。
Trait 和 Class 相似,但僅僅旨在用細(xì)粒度和一致的方式來組合功能。 無法通過 trait 自身來實例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說,應(yīng)用的幾個 Class 之間不需要繼承。
Trait 簡單的來說,就是將一些通用的,可重復(fù)的方法獨(dú)立出去,拆分成為可復(fù)用的組件,最后只要在需要的地方 use 組件,所有代碼以【插件】的形式引入,這樣的代碼可讀性更高。
如何將一個完整的代碼進(jìn)行拆分,分解出一些可復(fù)用的組件,就是我們實際寫代碼的場景決定了。如 Laravel 隊列。
Laravel 隊列Laravel 隊列為不同的后臺隊列服務(wù)提供統(tǒng)一的 API , 例如 Beanstalk,Amazon SQS, Redis,甚至其他基于關(guān)系型數(shù)據(jù)庫的隊列。 隊列的目的是將耗時的任務(wù)延時處理,比如發(fā)送郵件,從而大幅度縮短Web請求和相應(yīng)的時間。
隊列配置文件存放在 config/queue.php。 每一種隊列驅(qū)動的配置都可以在該文件中找到, 包括數(shù)據(jù)庫, Beanstalkd, Amazon SQS, Redis, 以及同步(本地使用)驅(qū)動。 其中還包含了一個 null 隊列驅(qū)動用于那些放棄隊列的任務(wù)
創(chuàng)建 Laravel 隊列也很簡單,只需要在 Jobs 目錄下創(chuàng)建類,集成 ShouldQueue 接口即可,如:
message = $message; } public function handle() { $options = [ "tag" => "wechat", "text" => $this->message ]; $this->sendRequest("url", $options, "", "POST"); } }
其它的根據(jù)需要,通過引入 Trait 即可,如上述代碼的三個 Trait: InteractsWithQueue, Queueable, SerializesModels,每個 Trait 各司其職:
getProperties(); foreach ($properties as $property) { $property->setValue($this, $this->getSerializedPropertyValue( $this->getPropertyValue($property) )); } return array_map(function ($p) { return $p->getName(); }, $properties); } /** * Restore the model after serialization. * * @return void */ public function __wakeup() { foreach ((new ReflectionClass($this))->getProperties() as $property) { $property->setValue($this, $this->getRestoredPropertyValue( $this->getPropertyValue($property) )); } } /** * Get the property value for the given property. * * @param ReflectionProperty $property * @return mixed */ protected function getPropertyValue(ReflectionProperty $property) { $property->setAccessible(true); return $property->getValue($this); } }
這個 SerializesModels Trait 的主要作用是,如果你的消息隊列的構(gòu)造器中接收了 Eloguent 模型,那么就可識別出該模型的屬性會被序列化到隊列里。當(dāng)任務(wù)被實際運(yùn)行時,隊列系統(tǒng)便會自動從數(shù)據(jù)庫中重新取回完整的模型。這整個過程對這個任務(wù)類來說,完全透明,根本上就不用去關(guān)心和 Eloguent 模型序列化和反序列化的問題。如果任務(wù)隊列中,如果不需要引入 Eloquent 模型,可以不需要 use SerializesModels。
同樣的道理,根據(jù)引入不同的 Trait 來完成對應(yīng)的功能。
總結(jié)Laravel 框架大量使用了 traits。只要有心觀察,還是能看出這種寫法所帶來的好處,和代碼的可擴(kuò)展性。
參考http://php.net/manual/zh/language.oop5.traits.php
http://d.laravel-china.org/docs/5.4/queues
聽說最美的人和最帥的人,都會給作者打賞,以資鼓勵
coding01 期待您關(guān)注
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/25718.html
摘要:今天無事,偶爾看到中的版本選擇處有關(guān)于各版本的區(qū)別的簡短描述,于是總結(jié)一下。相對于之前版本,最大區(qū)別也就是命名空間和匿名函數(shù)了,這在平時開發(fā)和各大框架中都用的比較多了,就不再詳述了。的主要更新是數(shù)組簡寫語法格式和了。 今天無事,偶爾看到phpstorm中的版本選擇處有關(guān)于各版本的區(qū)別的簡短描述,于是總結(jié)一下。 showImg(https://segmentfault.com/img/b...
摘要:個人網(wǎng)站最近剛寫了一個手機(jī)在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈?zhǔn)秸{(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個人網(wǎng)站:...
摘要:是一種為類似的單繼承語言而準(zhǔn)備的代碼復(fù)用機(jī)制。因為中的變量環(huán)境是基于函數(shù)的,所以會輸出博客鏈接代碼復(fù)用機(jī)制,本文后續(xù)如有更新將會在博客更新。 提到 php 的代碼復(fù)用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產(chǎn)生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現(xiàn)代碼復(fù)用呢? 自 PHP 5.4.0 起,PHP 實現(xiàn)了另外...
摘要:很明顯這違背了原則。而方式則避免了上述的不足之處相對優(yōu)雅的實現(xiàn)了代碼的復(fù)用。中屬性的優(yōu)先級說到優(yōu)先級就必須要有一個對比的參照物這里的參照對象時引用的類及其父類。其他介紹的的文章如何使用文章首發(fā)在中詳解及其應(yīng)用 從PHP的5.4.0版本開始,PHP提供了一種全新的代碼復(fù)用的概念,那就是Trait。Trait其字面意思是特性、特點(diǎn),我們可以理解為,使用Trait關(guān)鍵字,可以為PHP中的類添...
閱讀 3376·2021-10-11 11:08
閱讀 4498·2021-09-22 15:54
閱讀 977·2019-08-30 15:56
閱讀 924·2019-08-30 15:55
閱讀 3603·2019-08-30 15:52
閱讀 1424·2019-08-30 15:43
閱讀 1996·2019-08-30 11:14
閱讀 2566·2019-08-29 16:11