精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PHP中Trait詳解及其應(yīng)用

開(kāi)發(fā) 后端
從PHP的5.4.0版本開(kāi)始,PHP提供了一種全新的代碼復(fù)用的概念,那就是Trait。Trait其字面意思是”特性”、”特點(diǎn)”,我們可以理解為,使用Trait關(guān)鍵字,可以為PHP中的類(lèi)添加新的特性。

從PHP的5.4.0版本開(kāi)始,PHP提供了一種全新的代碼復(fù)用的概念,那就是Trait。Trait其字面意思是”特性”、”特點(diǎn)”,我們可以理解為,使用Trait關(guān)鍵字,可以為PHP中的類(lèi)添加新的特性。

熟悉面向?qū)ο蟮亩贾?軟件開(kāi)發(fā)中常用的代碼復(fù)用有繼承和多態(tài)兩種方式。在PHP中,只能實(shí)現(xiàn)單繼承。而Trait則避免了這點(diǎn)。下面通過(guò)簡(jiǎn)單的額例子來(lái)進(jìn)行對(duì)比說(shuō)明。

1. 繼承 VS 多態(tài) VS Trait

現(xiàn)在有Publish.phpAnswer.php這兩個(gè)類(lèi)。要在其中添加LOG功能,記錄類(lèi)內(nèi)部的動(dòng)作。有以下幾種方案:

  • 繼承
  • 多態(tài)
  • Trait

1.1. 繼承

如圖:

代碼結(jié)構(gòu)如下:

// Log.php
<?php
Class Log {
    public function startLog()     {
        // echo ...
    }

    public function endLog()     {
        // echo ...
    }
}
// Publish.php
<?php
Class Publish extends Log {

}
// Answer.php
<?php
Class Answer extends Log {

}

可以看到繼承的確滿足了要求。但這卻違背了面向?qū)ο蟮脑瓌t。而發(fā)布(Publish)和回答(Answer)這樣的操作和日志(Log)之間的關(guān)系并不是子類(lèi)與父類(lèi)的關(guān)系。所以不推薦這樣使用。

1.2. 多態(tài)

如圖:

實(shí)現(xiàn)代碼:

// Log.php
<?php
Interface Log {
    public function startLog();
    public function endLog();
}
// Publish.php
<?php
Class Publish implements Log {
    public function startLog()     {
        // TODO: Implement startLog() method.
    }
    public function endLog()     {
        // TODO: Implement endLog() method.
    }
}
// Answer.php
<?php
Class Answer implements Log {
    public function startLog()     {
        // TODO: Implement startLog() method.
    }
    public function endLog()     {
        // TODO: Implement endLog() method.
    }
}

記錄日志的操作應(yīng)該都是一樣的,因此,發(fā)布(Publish)和回答(Answer)動(dòng)作中的日志記錄實(shí)現(xiàn)也是一樣的。很明顯,這違背了DRY(Don’t Repeat Yourself)原則。所以是不推薦這樣實(shí)現(xiàn)的。

1.3. Trait

如圖:

實(shí)現(xiàn)代碼如下:

// Log.php
<?php
trait Log{
    public function startLog() {
        // echo ..
    }
    public function endLog() {
        // echo ..
    }
}
// Publish.php
<?php
class Publish {
    use Log;
}
$publish = new Publish();
$publish->startLog();
$publish->endLog();
// Answer.php
<?php
class Answer {
    use Log;
}
$answer = new Answer();
$answer->startLog();
$answer->endLog();

可以看到,我們?cè)跊](méi)有增加代碼復(fù)雜的情況下,實(shí)現(xiàn)了代碼的復(fù)用。

1.4. 結(jié)論

繼承的方式雖然也能解決問(wèn)題,但其思路違背了面向?qū)ο蟮脑瓌t,顯得很粗暴;多態(tài)方式也可行,但不符合軟件開(kāi)發(fā)中的DRY原則,增加了維護(hù)成本。而Trait方式則避免了上述的不足之處,相對(duì)優(yōu)雅的實(shí)現(xiàn)了代碼的復(fù)用。

2. Trait的作用域

了解了Trait的好處,我們還需要了解其實(shí)現(xiàn)中的規(guī)則,先來(lái)說(shuō)一下作用域。這個(gè)比較好證明,實(shí)現(xiàn)代碼如下:

<?php
class Publish {
    use Log;
    public function doPublish() {
        $this->publicF();
        $this->protectF();
        $this->privateF();
    }
}
$publish  = new Publish();
$publish->doPublish();

執(zhí)行上述代碼輸出結(jié)果如下:

public function
protected function
private function

可以發(fā)現(xiàn),Trait的作用域在引用該Trait類(lèi)的內(nèi)部是都可見(jiàn)的。可以理解為use關(guān)鍵字將Trait的實(shí)現(xiàn)代碼Copy了一份到引用該Trait的類(lèi)中。

3. Trait中屬性的優(yōu)先級(jí)

說(shuō)到優(yōu)先級(jí),就必須要有一個(gè)對(duì)比的參照物,這里的參照對(duì)象時(shí)引用Trait的類(lèi)及其父類(lèi)。

通過(guò)以下的代碼來(lái)證明Trait應(yīng)用中的屬性的優(yōu)先級(jí):

<?php
trait Log
{
    public function publicF()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
    protected function protectF()     {
        echo __METHOD__ . ' protected function' . PHP_EOL;
    }
}

class Question {
    public function publicF()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
    protected function protectF()     {
        echo __METHOD__ . ' protected function' . PHP_EOL;
    }
}

class Publish extends Question {
    use Log;

    public function publicF()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
    public function doPublish()     {
        $this->publicF();
        $this->protectF();
    }
}
$publish = new Publish();
$publish->doPublish();

上述代碼的輸出結(jié)果如下:

Publish::publicF public function
Log::protectF protected function

通過(guò)上面的例子,可以總結(jié)出Trait應(yīng)用中的優(yōu)先級(jí)如下:

  1. 來(lái)自當(dāng)前類(lèi)的成員覆蓋了 trait 的方法
  2. trait 覆蓋了被繼承的方法

類(lèi)成員優(yōu)先級(jí)為:當(dāng)前類(lèi)>Trait>父類(lèi)

4. Insteadof和As關(guān)鍵字

在一個(gè)類(lèi)中,可以引用多個(gè)Trait,如下:

<?php
trait Log
{
    public function startLog()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
    protected function endLog()     {
        echo __METHOD__ . ' protected function' . PHP_EOL;
    }
}

trait Check
{
    public function parameterCheck($parameters) {
        // do sth
    }
}

class Publish extends Question {
    use Log,Check;
    public function doPublish($para) {
        $this->startLog();
        $this->parameterCheck($para);
        $this->endLog();
    }
}

通過(guò)上面的方式,我們可以在一個(gè)類(lèi)中引用多個(gè)Trait。引用多個(gè)Trait的時(shí)候,就容易出問(wèn)題了,最常見(jiàn)的問(wèn)題就是兩個(gè)Trait中如果出現(xiàn)了同名的屬性或者方法該怎么辦呢?這個(gè)時(shí)候就需要用到Insteadof 和 as 這兩個(gè)關(guān)鍵字了.請(qǐng)看如下實(shí)現(xiàn)代碼:

<?php

trait Log
{
    public function parameterCheck($parameters)     {
        echo __METHOD__ . ' parameter check' . $parameters . PHP_EOL;
    }

    public function startLog()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
}

trait Check
{
    public function parameterCheck($parameters)     {
        echo __METHOD__ . ' parameter check' . $parameters . PHP_EOL;
    }

    public function startLog()     {
        echo __METHOD__ . ' public function' . PHP_EOL;
    }
}

class Publish {
    use Check, Log {
        Check::parameterCheck insteadof Log;
        Log::startLog insteadof Check;
        Check::startLog as csl;
    }

    public function doPublish()     {
        $this->startLog();
        $this->parameterCheck('params');
        $this->csl();
    }
}

$publish = new Publish();
$publish->doPublish();

執(zhí)行上述代碼,輸出結(jié)果如下:

Log::startLog public function
Check::parameterCheck parameter checkparams
Check::startLog public function

就如字面意思一般,insteadof關(guān)鍵字用前者取代了后者,as 關(guān)鍵字給被取代的方法起了一個(gè)別名。

在引用Trait時(shí),使用了use關(guān)鍵字,use關(guān)鍵字也用來(lái)引用命名空間。兩者的區(qū)別在于,引用Trait時(shí)是在class內(nèi)部使用的。

責(zé)任編輯:張燕妮 來(lái)源: lanffy
相關(guān)推薦

2009-12-30 10:23:30

VLAN技術(shù)

2010-09-08 14:53:51

CSS繼承

2010-06-18 10:58:28

UML模型元素

2013-12-04 14:19:40

JavaScript代碼重用

2010-10-19 08:59:40

PHP緩存技術(shù)

2022-07-22 16:36:23

協(xié)作機(jī)器人機(jī)器人

2015-04-07 10:31:31

PHPMySQLBuffer用法

2009-10-26 09:41:26

PHP5.3閉包特性

2022-03-24 10:23:51

時(shí)間輪方法任務(wù)

2014-09-30 09:20:13

SDN openflow NFV

2009-02-01 10:04:44

JSPJavaBeanJavaBean應(yīng)用

2011-08-02 17:27:06

iPhone應(yīng)用 剪切技巧

2009-03-16 16:08:09

PHP異常

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2010-06-12 11:22:57

UML應(yīng)用

2023-10-16 10:25:34

數(shù)據(jù)科學(xué)大數(shù)據(jù)

2020-12-22 06:05:43

Mbedtls應(yīng)用基礎(chǔ)

2017-09-01 15:49:41

Raft算法CMQ

2022-09-29 08:00:00

人工智能運(yùn)輸公平性

2017-01-17 09:38:52

ZooKeeperHadoopHBase
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

在线视频一二区| 国产精品二区三区四区| 成人小视频免费看| 日本欧美在线| 亚洲国产成人porn| 日本黄网免费一区二区精品| 一级黄色片免费| 韩日在线一区| 国产一区二区三区四区福利| 日韩久久久久久久久久久| 高潮在线视频| **网站欧美大片在线观看| 国产精品中出一区二区三区| 日韩黄色片网站| 国模吧视频一区| 最近2019中文字幕大全第二页| 国产一精品一aⅴ一免费| 韩国成人漫画| 一区二区三区av电影| 日韩免费av电影| 刘玥91精选国产在线观看| 免费在线观看日韩欧美| 久久免费视频网站| 国产精品jizz在线观看麻豆| 妺妺窝人体色www婷婷| 99a精品视频在线观看| 在线观看一区日韩| 国产特级淫片高清视频| 国产在线激情| 国产欧美精品一区| 狠狠色综合网站久久久久久久| 国产精品久久免费| 奇米色一区二区三区四区| 97香蕉超级碰碰久久免费软件| 一起操在线播放| gogogo高清在线观看一区二区| 精品成人免费观看| 成人免费播放视频| 亚洲影视资源| 欧美日韩成人一区二区| 国产一级不卡毛片| 亚洲午夜天堂| 欧美午夜电影在线| 自拍日韩亚洲一区在线| 人人澡人人添人人爽一区二区| 中文字幕在线观看不卡视频| 日本成人三级| 国产网站在线播放| 久久亚区不卡日本| 久久久综合亚洲91久久98| 男人天堂手机在线观看| 国产成人精品1024| 成人黄色在线免费观看| 99久久久国产精品无码网爆| 韩国三级中文字幕hd久久精品| 国产精品一区二区三| 日本中文字幕在线观看视频| 亚洲综合日韩| 国产精品久久久久福利| 五月激情丁香网| 日本视频免费一区| 国产一区二区丝袜| 91美女精品网站| 喷白浆一区二区| 国产一区私人高清影院| 国产精品一区二区三区在线免费观看| 久久69国产一区二区蜜臀| 成人黄色大片在线免费观看| 国产三区在线播放| 国产一区丝袜| av在线不卡电影| 国产高清不卡av| 污视频网站在线播放| 91视视频在线直接观看在线看网页在线看 | 亚洲理论在线a中文字幕| av av在线| 亚洲综合福利| 中文字幕日韩在线观看| 内射一区二区三区| 一区二区自拍| 国产91精品网站| 在线观看中文字幕码| 国产一区亚洲一区| 国产一区不卡在线观看| 国模精品一区二区| 国产精品成人一区二区三区夜夜夜| 麻豆md0077饥渴少妇| av日韩中文| 在线观看成人小视频| 九九久久久久久| 老司机aⅴ在线精品导航| 亚洲网站在线看| 深夜福利影院在线观看| 亚洲免费中文| 成人欧美一区二区三区在线| 日韩在线视频免费| 国产精品久线观看视频| 老子影院午夜伦不卡大全| 久久电影tv| 日韩一区二区三区视频在线观看| 中文字幕在线播放视频| 欧美xxxxx视频| 97视频在线观看免费| 亚洲天堂免费av| 99视频精品全部免费在线| 亚洲在线观看一区| 国产色播av在线| 在线成人午夜影院| 自拍偷拍中文字幕| 欧美日韩1区2区3区| 国产精品激情自拍| 人妻偷人精品一区二区三区| 国产精品另类一区| 日本一本二本在线观看| 一区二区三区在线免费看| 国产成人自拍网| 国产欧美日韩高清| 性感美女视频一二三| 亚洲欧美二区三区| 黄色国产小视频| 精品国产午夜肉伦伦影院| 日韩中文字幕网| 天天干天天干天天操| 国产成人在线观看免费网站| 亚洲精品中文字幕在线 | 欧美性资源免费| 国产99久久九九精品无码免费| 国产日产亚洲精品系列| 国产av天堂无码一区二区三区| 国产精品视频一区二区三区综合| 亚洲视频在线免费观看| 日本在线视频免费| 国产福利91精品一区二区三区| 亚洲一区三区电影在线观看| 成人看片在线观看| 亚洲欧洲第一视频| 午夜影院在线看| 成人av网站在线| 青青青在线观看视频| 国产精品3区| 另类图片亚洲另类| 97超碰人人草| 亚洲欧洲日韩女同| 亚洲人辣妹窥探嘘嘘| 精品久久网站| 国产精品高潮呻吟久久av无限| 日韩a级作爱片一二三区免费观看| 亚洲午夜久久久久久久久久久| 搡的我好爽在线观看免费视频| 成人综合专区| 国产欧美日韩精品在线观看 | 亚洲a级精品| 2024亚洲男人天堂| 日韩av高清在线| 色婷婷综合久久久中文一区二区| 中文字幕5566| 久久最新视频| 午夜一区二区三区| 亚洲国产精选| 九九精品视频在线| 丰满肉肉bbwwbbww| 五月婷婷综合激情| 亚洲第一香蕉网| 日本v片在线高清不卡在线观看| 中文字幕久久精品| 牛夜精品久久久久久久| 欧美色图国产精品| 成人免费在线视频网站| 91麻豆一二三四在线| 欧美草草影院在线视频| 日韩毛片在线视频| 久久久99久久| 一道本在线免费视频| 亚洲国产不卡| 国产精品一区二区欧美| 26uuu亚洲电影| 中文字幕在线看视频国产欧美在线看完整 | 国产精品电影院| 日本成人在线免费观看| 亚洲经典自拍| 日本精品一区二区三区视频| 日韩精品一页| 久久久欧美精品| 国产中文在线视频| 宅男噜噜噜66一区二区66| 久视频在线观看| 久久只精品国产| 伊人五月天婷婷| 国产欧美一区二区三区国产幕精品| 欧美一二三区| 欧美久久亚洲| 国产91免费观看| 国产丝袜在线| 精品一区二区三区三区| 国产精品久久影视| 欧美特级www| 精国产品一区二区三区a片| 久久亚洲精品小早川怜子| 久久精品无码一区二区三区毛片| 一区二区国产精品| 自拍偷拍一区二区三区| 欧美一区二区三区久久| 成人免费在线视频网址| 欧美电影免费看| 欧美成在线视频| 成年人视频网站在线| 日韩精品一区二区三区中文不卡| 黄色av一区二区| 亚洲成人一区二区| 四虎884aa成人精品| 91女神在线视频| 波多野结衣三级视频| 蜜臀精品久久久久久蜜臀| av在线播放亚洲| 中文字幕一区二区av| 色乱码一区二区三在线看| 精品av导航| 日本一区二区成人| 精品91一区二区三区| 美日韩中文字幕| 国产精品大全| 国产精品一级在线观看| 国产精品久久久久久亚洲调教 | 神马久久久久久久久久| 91精品国产综合久久久久久久久久| 天堂网一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 91视频免费在观看| 91亚洲精华国产精华精华液| 深夜视频在线观看| 国产乱人伦偷精品视频免下载| 一区二区三区 欧美| 三级久久三级久久| 99999精品视频| 国产精品普通话对白| 日韩网站在线免费观看| 黑丝一区二区| 高清无码一区二区在线观看吞精| 国产高清欧美| 三年中文高清在线观看第6集| 日韩免费视频| 亚洲欧美丝袜| 久久视频精品| 正在播放一区| 小处雏高清一区二区三区| 性欧美videosex高清少妇| 精品理论电影| 亚洲亚洲精品三区日韩精品在线视频| 欧美一区二区性| 亚洲国产精品综合| 欧美xxav| 精品成在人线av无码免费看| 狠狠爱www人成狠狠爱综合网 | 成人免费观看在线观看| 久久久久久久香蕉网| а√在线中文网新版地址在线| 久久久影视精品| 亚洲精品中文字幕| 国产91免费观看| 欧美大片网站| 91精品啪在线观看麻豆免费| 国产乱码精品一区二区三区亚洲人 | 久久成人羞羞网站| 亚洲av毛片在线观看| 国产精品一区二区久久不卡 | 韩国女主播一区二区三区| 精品国产乱码久久久久久久软件| 亚洲区小说区图片区qvod按摩| 日韩高清国产一区在线观看| 欧美r级电影| 欧美日韩的一区二区| 亚洲图片欧美日韩| 在线综合视频播放| 欧美一区二区黄片| 亚洲精品美女在线观看| 国产视频精选在线| 久久久精品国产亚洲| 超碰97国产精品人人cao| 欧美有码在线视频| 亚洲精品777| 精品高清视频| 国产精品99一区二区三区| 菠萝蜜视频在线观看入口| 亚洲综合电影一区二区三区| 奇米视频888| proumb性欧美在线观看| 黄色一级片一级片| 亚洲图片欧美一区| 日韩中文字幕高清| 欧美一卡2卡3卡4卡| 日韩av地址| 欧美成人精品h版在线观看| 一区二区精品伦理...| 成人黄在线观看| 牛牛影视一区二区三区免费看| 色一情一乱一伦一区二区三欧美 | 丰满少妇在线观看| 国产成人免费高清| 卡一卡二卡三在线观看| 亚洲一区二区黄色| 在线免费一级片| 亚洲精品白浆高清久久久久久| aaa日本高清在线播放免费观看| 欧美精品videos另类日本| 91九色综合| 久久超碰亚洲| 欧美日韩免费| 中文字幕永久有效| 久久这里都是精品| 国产a免费视频| 欧美日韩综合色| 欧美套图亚洲一区| 高清欧美一区二区三区| 亚洲欧美一级| 欧美日韩日本国产| 91在线观看喷潮| 亚洲人成电影在线| sm久久捆绑调教精品一区| 亚洲一区二区三区在线免费观看| 中文字幕av一区二区三区人| 加勒比成人在线| 国产精品中文字幕日韩精品| 日本成人精品视频| 91国偷自产一区二区开放时间| 国产77777| 欧美极品少妇xxxxⅹ喷水| 欧美视频精品| 日本高清不卡一区二区三| 久久精品人人做人人爽电影蜜月| 韩国av中国字幕| 一区二区三区在线视频观看58| 中文字幕码精品视频网站| 亚洲人成网站在线播| 乡村艳史在线观看| 久久青青草原一区二区| 亚洲深夜福利| 7788色淫网站小说| 香蕉加勒比综合久久| 亚洲AV无码精品自拍| 欧美成人一二三| 日本一区二区三区视频在线看 | 国产亚洲综合性久久久影院| 欧美不卡视频在线观看| 亚洲成人三级在线| av2020不卡| 精品伦精品一区二区三区视频 | 亚洲免费在线视频| 国产精品国产三级国产aⅴ | 超碰91在线观看| 黄色一区三区| 久久99伊人| 女女互磨互喷水高潮les呻吟| 色视频成人在线观看免| 国产大学生校花援交在线播放| 国产精品女人久久久久久| 久久一区二区中文字幕| www.桃色.com| 一二三区精品视频| 黄色小视频免费观看| 57pao成人国产永久免费| 国产精品亚洲片在线播放| www.99在线| 亚洲色图一区二区三区| 亚洲精品国产精| 91精品国产91久久久久久吃药| 日韩成人动漫在线观看| 亚洲乱码国产一区三区| 国产精品青草综合久久久久99| 国产又粗又猛视频免费| 欧美精品日韩www.p站| 超碰成人在线免费| 欧美黄色一级片视频| 国产精品国产精品国产专区不片 | 国产aⅴ精品一区二区三区色成熟| 国产无遮挡裸体免费视频| 亚洲男人天天操| 99久热在线精品视频观看| av网站大全免费| 久久久国产精华| 国产av无码专区亚洲av麻豆| 久久久久久久久久久网站| 精品国产乱码久久久久久蜜坠欲下| 午夜精品中文字幕| 亚州成人在线电影| 浮生影视网在线观看免费| 7777精品久久久大香线蕉小说 | 中文字幕第88页| 亚洲一区二区视频在线观看| 免费在线超碰| 999在线观看免费大全电视剧| 国产亚洲精品v| 欧美一级特黄高清视频| 亚洲国产精彩中文乱码av| 99久久精品日本一区二区免费| 欧美在线一区二区| 国产探花在线观看| 新呦u视频一区二区| 成人精品电影在线观看| 五月天中文字幕| 午夜精品久久久久久99热软件|