日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP基礎(chǔ)之類和對(duì)象12——Traits專題

瀏覽:40日期:2022-09-14 18:21:33

自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了代碼復(fù)用的一個(gè)方法,稱為 traits。

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

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

Example #1 Trait 示例

trait ezcReflectionReturnInfo{ function getReturnType(){} function getReturnDescription(){}}class ezcReflectionMethod extends ReflectionMethod{ use ezcReflectionReturnInfo;}class ezcReflectionFunction extends ReflectionFunction{ use ezcReflectionReturnInfo;}優(yōu)先級(jí)

從基類繼承的成員被 trait 插入的成員所覆蓋。優(yōu)先順序是來(lái)自當(dāng)前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

Example #2 優(yōu)先順序示例

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優(yōu)先順序是當(dāng)前類中的方法會(huì)覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法:

class Base{ public function sayHello(){echo 'Hello '; }}trait SayWorld{ public function sayHello(){parent::sayHello();echo ’World!’; }}class MyHelloWorld extends Base{ use SayWorld;}$o = new MyHelloWorld();$o -> sayHello();

輸出結(jié)果:

Hello World!

Example #3 另一個(gè)優(yōu)先級(jí)順序的例子

trait HelloWorld{ public function sayHello(){echo ’Hello World!’; }}class TheWorldIsNotEnough{ use HelloWorld; public function sayHello(){echo ’Hello Universe!’; }}$o = new TheWorldIsNotEnough;$o -> sayHello();

輸出結(jié)果:

Hello Universe!

多個(gè) trait

通過(guò)逗號(hào)分隔,在 use 聲明列出多個(gè) trait,可以都插入到一個(gè)類中。

Example #4 多個(gè) trait 的用法

trait Hello{ public function sayHello(){echo ’Hello ’; }}trait World{ public function sayWorld(){echo ’World’; }}class MyHelloWorld{ use Hello,World; public function sayExclamationMark(){echo ’!’; }}$o = new MyHelloWorld();$o -> sayHello();$o -> sayWorld();$o -> sayExclamationMark();

輸出結(jié)果:

Hello World!

沖突的解決

如果兩個(gè) trait 都插入了一個(gè)同名的方法,如果沒(méi)有明確解決沖突將會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤。

為了解決多個(gè) trait 在同一個(gè)類中的命名沖突,需要使用 insteadof 操作符來(lái)明確指定使用沖突方法中的哪一個(gè)。

以上方式僅允許排除掉其它方法,as 操作符可以將其中一個(gè)沖突的方法以另一個(gè)名稱來(lái)引入。

Example #5 沖突的解決

在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有沖突的方法,其定義了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。

Aliased_Talker 使用了 as 操作符來(lái)定義了 talk 來(lái)作為 B 的 bigTalk 的別名。

trait A{ public function smallTalk(){echo ’a’; } public function bigTalk(){echo ’A’; }}trait B{ public function smallTalk(){echo ’b’; } public function bigTalk(){echo ’B’; }}class Talker{ use A,B{B::smallTalk insteadof A;A::bigTalk insteadof B; }}class Aliased_Talker{ use A,B{B::smallTalk insteadof A;A::bigTalk insteadof B;B::bigTalk as talk; }}$t = new Talker;$t->smallTalk(); //b$t->bigTalk(); //A$at = new Aliased_Talker;$at->smallTalk(); //b$at->bigTalk(); //A$at->talk(); //B修改方法的訪問(wèn)控制

使用 as 語(yǔ)法還可以用來(lái)調(diào)整方法的訪問(wèn)控制。

Example #6 修改方法的訪問(wèn)控制

trait HelloWorld{ public function sayHello(){echo ’Hello World!’; }}//修改sayHello的訪問(wèn)控制class MyClass1{ use HelloWorld{sayHello as protected; }}//給方法一個(gè)改變了訪問(wèn)控制的別名//原版sayHello的訪問(wèn)控制則沒(méi)有發(fā)生變化class MyClass2{ use HelloWorld{sayHello as private myPrivateHello;}}從 trait 來(lái)組成 trait

正如類能夠使用 trait 一樣,其它 trait 也能夠使用 trait。在 trait 定義時(shí)通過(guò)使用一個(gè)或多個(gè) trait,它能夠組合其它 trait 中的部分或全部成員。

Example #7 從 trait 來(lái)組成 trait

trait Hello{ public function sayHello(){echo ’Hello ’; }}trait World{ public function sayWorld(){echo ’World!’; }}trait HelloWorld{ use Hello,World;}class MyHelloWorld{ use HelloWorld;}$o = new MyHelloWorld;$o -> sayHello();$o -> sayWorld();

輸出結(jié)果:

Hello World!

Trait 的抽象成員

為了對(duì)使用的類施加強(qiáng)制要求,trait 支持抽象方法的使用。

Example #8 表示通過(guò)抽象方法來(lái)進(jìn)行強(qiáng)制要求

trait Hello{ public function sayHelloWorld(){echo ’Hello’.$this->getWorld(); } abstract public function getWorld();}class MyHelloWorld{ private $world; use Hello; public function getWorld(){return $this->world; } public function setWorld($val){$this->world = $val; }}Trait 的靜態(tài)成員

靜態(tài)變量可以被 trait 的方法引用,但不能被 trait 定義。但是 trait 能夠?yàn)槭褂玫念惗x靜態(tài)方法。

Example #9 靜態(tài)變量

trait Counter{ public function inc(){static $c = 0;$c = $c + 1;echo '{$c}<br>'; }}class C1{ use Counter;}class C2{ use Counter;}$o = new C1();$o->inc(); //echo 1$p = new C2;$p->inc(); //echo 1

Example #10 靜態(tài)方法

trait StaticExample{ public static function doSomething(){return ’Doing something.’; }}class Example{ use StaticExample;}Example::doSomething();

輸出結(jié)果:Doing something.

屬性Trait 同樣可以定義屬性。

Example #11 定義屬性

trait PropertiesTrait{ public $x = 1;}class PropertiesExample{ use PropertiesTrait;}$example = new PropertiesExample;$example->x;

如果 trait 定義了一個(gè)屬性,那類將不能定義同樣名稱的屬性,否則會(huì)產(chǎn)生一個(gè)錯(cuò)誤。如果該屬性在類中的定義與在 trait 中的定義兼容(同樣的可見(jiàn)性和初始值)則錯(cuò)誤的級(jí)別是?E_STRICT,否則是一個(gè)致命錯(cuò)誤。

Example #12 沖突

trait PropertiesTrait{ public $sname = true; public $different = false;}class PropertiesExample{ use PropertiesTrait; public $sname = true; //Strict Standards public $different = true; //致命錯(cuò)誤}

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久免费视频66| 久久黄色影院| 久久精品观看| 久久精品观看| 国产精品日本欧美一区二区三区| 麻豆国产精品| 黄色在线网站噜噜噜| 蜜桃视频在线网站| 日韩精品看片| 久久国产福利| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 亚洲精品免费观看| 日本不卡一区二区三区| 国产精品激情电影| 高清av不卡| 午夜在线视频观看日韩17c| 亚洲影视一区二区三区| 国产精品最新| 精品三级在线观看视频| 高清不卡亚洲| 亚洲a成人v| 日韩电影二区| 亚洲精品成人一区| 日韩欧美美女在线观看| 国产精品亚洲综合色区韩国| 国产成人久久精品一区二区三区| 天堂av在线| 中文一区一区三区免费在线观 | 久久精品理论片| 激情视频一区二区三区| 蜜臀av亚洲一区中文字幕| 国产视频网站一区二区三区| 三级在线看中文字幕完整版| 性一交一乱一区二区洋洋av| 国产欧美午夜| 在线综合亚洲| 日韩欧美精品综合| 国产精品久久| 亚洲精品婷婷| jizzjizz中国精品麻豆| 首页欧美精品中文字幕| 成人在线黄色| 综合干狼人综合首页| 精品三级国产| 在线一区二区三区视频| 韩国精品主播一区二区在线观看 | 久久狠狠婷婷| 亚洲精品**中文毛片| 国产精品99久久免费| 羞羞答答国产精品www一本| 999国产精品永久免费视频app| 欧美国产亚洲精品| 久久亚洲影院| 一区二区小说| 99精品网站| 日韩精品网站| 亚洲小说欧美另类婷婷| 香蕉视频亚洲一级| 免费高潮视频95在线观看网站| 久久99国产精品视频| 欧美精品97| 欧美国产极品| 精品精品久久| 超碰成人av| 成人日韩在线观看| 亚洲成av人片一区二区密柚| 99热国内精品| 99久久婷婷| 亚洲性图久久| 少妇精品在线| 国产精品国码视频| 福利一区二区免费视频 | 亚洲在线久久| 日本中文字幕一区二区| 国产精品一区亚洲| 精品视频一区二区三区在线观看| 国产精东传媒成人av电影| 久久伊人久久| 欧洲一区二区三区精品| 免费久久久久久久久| 欧洲激情综合| 亚洲精品无吗| 久久久男人天堂| 国产精品婷婷| 国产精品一站二站| 成人久久一区| 综合激情婷婷| 黄色aa久久| 亚洲精品无播放器在线播放| 另类小说一区二区三区| 婷婷激情图片久久| 国产欧美日韩一级| 亚洲手机视频| 麻豆精品久久| 鲁大师影院一区二区三区| 亚洲毛片一区| 欧美精品日日操| 91亚洲无吗| 欧美1区2区3区| 久久爱www成人| 日韩专区欧美专区| 吉吉日韩欧美| 国产精品最新| 日韩午夜视频在线| 影音先锋久久| 日韩免费视频| 久久精品国产精品亚洲毛片| 亚洲视频二区| 99久久精品国产亚洲精品| 久久精品凹凸全集| 亚洲激情中文在线| 精品精品国产三级a∨在线| 亚洲tv在线| 噜噜噜躁狠狠躁狠狠精品视频| 91精品啪在线观看国产18| 国产一区二区三区天码| 欧美精品影院| 日韩国产在线观看一区| 伊人久久一区| 免费不卡在线观看| 好看的亚洲午夜视频在线| 日韩精品欧美激情一区二区| 精品久久精品| 日本久久精品| 日韩1区2区| 97精品国产一区二区三区| 国产日韩亚洲| 国产精品99久久免费| 欧美黑人巨大videos精品| 国产欧美一区二区三区米奇| 欧美日本一区| 久久国际精品| 国产精品一区二区三区av麻| 日本在线一区二区三区| 欧美一区自拍| 麻豆一区二区99久久久久| 欧美国产不卡| 日韩免费高清| 亚洲一区激情| 91欧美精品| 国产成年精品| 黄在线观看免费网站ktv| 久久婷婷亚洲| 日韩专区视频网站| 国产精品sm| 99久久久久国产精品| 亚洲一区二区av| 久久不见久久见中文字幕免费| 日韩在线欧美| 亚洲精品影院在线观看| 国产精品久久国产愉拍| 999久久久91| 午夜性色一区二区三区免费视频| 国产亚洲人成a在线v网站| 日韩av在线播放网址| 亚洲一区二区免费看| 97精品资源在线观看| 精品欧美一区二区三区在线观看| 蜜臀av亚洲一区中文字幕| 日韩av在线中文字幕| 视频一区中文字幕国产| 黄色欧美在线| 亚洲精品亚洲人成在线观看| 精品国产aⅴ| 亚洲综合电影一区二区三区| 国产欧美91| 天堂va蜜桃一区二区三区| 成人午夜在线| 日本欧美大码aⅴ在线播放| 久久婷婷亚洲| 精品久久国产一区| 亚洲一区有码| 亚洲精品小说| 久久男人av资源站| 国产精品久一| 日本一区二区中文字幕| 黄色av一区| 性欧美videohd高精| 久久精品国产在热久久| 亚洲欧美一级| 久久高清一区| 一区在线免费观看| 久久激情网站| 波多野结衣久久精品| 欧美国产日本| 国产精品欧美在线观看| 国产亚洲综合精品| 九九综合在线| 久久精品在线| 快播电影网址老女人久久| 九九九精品视频| 国产精品mm| 精品成av人一区二区三区| 久久97久久97精品免视看秋霞| 欧美一级网址| 91青青国产在线观看精品| 美女少妇全过程你懂的久久| 青青青免费在线视频| 91九色精品| 亚洲伊人精品酒店|