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