成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

簡(jiǎn)述我所理解的 PHP Trait

gecko23 / 1277人閱讀

摘要:和組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免傳統(tǒng)多繼承和類(lèi)相關(guān)典型問(wèn)題。隊(duì)列的目的是將耗時(shí)的任務(wù)延時(shí)處理,比如發(fā)送郵件,從而大幅度縮短請(qǐng)求和相應(yīng)的時(shí)間。同樣的道理,根據(jù)引入不同的來(lái)完成對(duì)應(yīng)的功能。

Trait 概念

在常規(guī)的 PHP 開(kāi)發(fā)中,我們都習(xí)慣于先編寫(xiě)一個(gè)通用的基類(lèi),實(shí)現(xiàn)基本的功能,然后擴(kuò)展這個(gè)基類(lèi),創(chuàng)建更具體的子類(lèi),直接從父類(lèi)繼承實(shí)現(xiàn)。很多編程語(yǔ)言都使用這個(gè)繼承層次結(jié)構(gòu)模式。大多數(shù)時(shí)候這種典型的繼承模型能夠良好運(yùn)作,但是如果想讓兩個(gè)無(wú)關(guān)的PHP 類(lèi)具有類(lèi)似的行為,而不是采用繼承的模式,應(yīng)該怎么做呢?

Trait 就是為了解決這種問(wèn)題而誕生的。Trait能夠把模塊化的實(shí)現(xiàn)方式注入多個(gè)無(wú)關(guān)的類(lèi)中,從而提高代碼復(fù)用,符合 DRY(Don’t Repeat Yourself)原則。

自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱(chēng)為 trait。

Trait 是為類(lèi)似 PHP 的單繼承語(yǔ)言而準(zhǔn)備的一種代碼復(fù)用機(jī)制。Trait 為了減少單繼承語(yǔ)言的限制,使開(kāi)發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類(lèi)中復(fù)用 method。Trait 和 Class 組合的語(yǔ)義定義了一種減少?gòu)?fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類(lèi)相關(guān)典型問(wèn)題。

Trait 和 Class 相似,但僅僅旨在用細(xì)粒度和一致的方式來(lái)組合功能。 無(wú)法通過(guò) trait 自身來(lái)實(shí)例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說(shuō),應(yīng)用的幾個(gè) Class 之間不需要繼承。

Trait 簡(jiǎn)單的來(lái)說(shuō),就是將一些通用的,可重復(fù)的方法獨(dú)立出去,拆分成為可復(fù)用的組件,最后只要在需要的地方 use 組件,所有代碼以【插件】的形式引入,這樣的代碼可讀性更高。

如何將一個(gè)完整的代碼進(jìn)行拆分,分解出一些可復(fù)用的組件,就是我們實(shí)際寫(xiě)代碼的場(chǎng)景決定了。如 Laravel 隊(duì)列。

Laravel 隊(duì)列

Laravel 隊(duì)列為不同的后臺(tái)隊(duì)列服務(wù)提供統(tǒng)一的 API , 例如 Beanstalk,Amazon SQS, Redis,甚至其他基于關(guān)系型數(shù)據(jù)庫(kù)的隊(duì)列。 隊(duì)列的目的是將耗時(shí)的任務(wù)延時(shí)處理,比如發(fā)送郵件,從而大幅度縮短Web請(qǐng)求和相應(yīng)的時(shí)間。

隊(duì)列配置文件存放在 config/queue.php。 每一種隊(duì)列驅(qū)動(dòng)的配置都可以在該文件中找到, 包括數(shù)據(jù)庫(kù), Beanstalkd, Amazon SQS, Redis, 以及同步(本地使用)驅(qū)動(dòng)。 其中還包含了一個(gè) null 隊(duì)列驅(qū)動(dòng)用于那些放棄隊(duì)列的任務(wù)

創(chuàng)建 Laravel 隊(duì)列也很簡(jiǎn)單,只需要在 Jobs 目錄下創(chuàng)建類(lèi),集成 ShouldQueue 接口即可,如:

message = $message;
    }

    public function handle() {
        $options = [
            "tag" => "wechat",
            "text" => $this->message
        ];

        $this->sendRequest("url", $options, "", "POST");
    }
}

其它的根據(jù)需要,通過(guò)引入 Trait 即可,如上述代碼的三個(gè) Trait: InteractsWithQueue, Queueable, SerializesModels,每個(gè) 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);
    }
}

這個(gè) SerializesModels Trait 的主要作用是,如果你的消息隊(duì)列的構(gòu)造器中接收了 Eloguent 模型,那么就可識(shí)別出該模型的屬性會(huì)被序列化到隊(duì)列里。當(dāng)任務(wù)被實(shí)際運(yùn)行時(shí),隊(duì)列系統(tǒng)便會(huì)自動(dòng)從數(shù)據(jù)庫(kù)中重新取回完整的模型。這整個(gè)過(guò)程對(duì)這個(gè)任務(wù)類(lèi)來(lái)說(shuō),完全透明,根本上就不用去關(guān)心和 Eloguent 模型序列化和反序列化的問(wèn)題。如果任務(wù)隊(duì)列中,如果不需要引入 Eloquent 模型,可以不需要 use SerializesModels。

同樣的道理,根據(jù)引入不同的 Trait 來(lái)完成對(duì)應(yīng)的功能。

總結(jié)

Laravel 框架大量使用了 traits。只要有心觀察,還是能看出這種寫(xiě)法所帶來(lái)的好處,和代碼的可擴(kuò)展性。

參考

http://php.net/manual/zh/language.oop5.traits.php

http://d.laravel-china.org/docs/5.4/queues


聽(tīng)說(shuō)最美的人和最帥的人,都會(huì)給作者打賞,以資鼓勵(lì)


coding01 期待您關(guān)注

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25718.html

相關(guān)文章

  • PHP5.3、5.4、5.5、5.6各版本重要更新簡(jiǎn)述

    摘要:今天無(wú)事,偶爾看到中的版本選擇處有關(guān)于各版本的區(qū)別的簡(jiǎn)短描述,于是總結(jié)一下。相對(duì)于之前版本,最大區(qū)別也就是命名空間和匿名函數(shù)了,這在平時(shí)開(kāi)發(fā)和各大框架中都用的比較多了,就不再詳述了。的主要更新是數(shù)組簡(jiǎn)寫(xiě)語(yǔ)法格式和了。 今天無(wú)事,偶爾看到phpstorm中的版本選擇處有關(guān)于各版本的區(qū)別的簡(jiǎn)短描述,于是總結(jié)一下。 showImg(https://segmentfault.com/img/b...

    _ipo 評(píng)論0 收藏0
  • 【日常手記】之Laravel5.3

    摘要:個(gè)人網(wǎng)站最近剛寫(xiě)了一個(gè)手機(jī)在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈?zhǔn)秸{(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。 關(guān)于作者 程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開(kāi)發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開(kāi)發(fā)。合適和夠用是最完美的追求。 個(gè)人網(wǎng)站:...

    kidsamong 評(píng)論0 收藏0
  • php 代碼復(fù)用機(jī)制--traits

    摘要:是一種為類(lèi)似的單繼承語(yǔ)言而準(zhǔn)備的代碼復(fù)用機(jī)制。因?yàn)橹械淖兞凯h(huán)境是基于函數(shù)的,所以會(huì)輸出博客鏈接代碼復(fù)用機(jī)制,本文后續(xù)如有更新將會(huì)在博客更新。 提到 php 的代碼復(fù)用,我們可能第一時(shí)間會(huì)想到繼承,但是這種單繼承語(yǔ)言一旦派生的子類(lèi)過(guò)多,那么會(huì)產(chǎn)生一系列的問(wèn)題,比如依賴父類(lèi)、耦合性太大、破壞了類(lèi)的封裝性。那么有沒(méi)有更好的方法來(lái)實(shí)現(xiàn)代碼復(fù)用呢? 自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了另外...

    yedf 評(píng)論0 收藏0
  • PHPTrait詳解及其應(yīng)用

    摘要:很明顯這違背了原則。而方式則避免了上述的不足之處相對(duì)優(yōu)雅的實(shí)現(xiàn)了代碼的復(fù)用。中屬性的優(yōu)先級(jí)說(shuō)到優(yōu)先級(jí)就必須要有一個(gè)對(duì)比的參照物這里的參照對(duì)象時(shí)引用的類(lèi)及其父類(lèi)。其他介紹的的文章如何使用文章首發(fā)在中詳解及其應(yīng)用 從PHP的5.4.0版本開(kāi)始,PHP提供了一種全新的代碼復(fù)用的概念,那就是Trait。Trait其字面意思是特性、特點(diǎn),我們可以理解為,使用Trait關(guān)鍵字,可以為PHP中的類(lèi)添...

    Blackjun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<