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

您的位置:首頁技術文章
文章詳情頁

PHP基礎之類和對象12——Traits專題

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

自 PHP 5.4.0 起,PHP 實現了代碼復用的一個方法,稱為 traits。

Traits 是一種為類似 PHP 的單繼承語言而準備的代碼復用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用方法集。Traits 和類組合的語義是定義了一種方式來減少復雜性,避免傳統多繼承和混入類(Mixin)相關的典型問題。

Traits 和一個類相似,但僅僅旨在用細粒度和一致的方式來組合功能。Trait 不能通過它自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用類的成員不需要繼承。

Example #1 Trait 示例

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

從基類繼承的成員被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

Example #2 優先順序示例

從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。其行為 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 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();

輸出結果:

Hello World!

Example #3 另一個優先級順序的例子

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

輸出結果:

Hello Universe!

多個 trait

通過逗號分隔,在 use 聲明列出多個 trait,可以都插入到一個類中。

Example #4 多個 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();

輸出結果:

Hello World!

沖突的解決

如果兩個 trait 都插入了一個同名的方法,如果沒有明確解決沖突將會產生一個致命錯誤。

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

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

Example #5 沖突的解決

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

Aliased_Talker 使用了 as 操作符來定義了 talk 來作為 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修改方法的訪問控制

使用 as 語法還可以用來調整方法的訪問控制。

Example #6 修改方法的訪問控制

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

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

Example #7 從 trait 來組成 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();

輸出結果:

Hello World!

Trait 的抽象成員

為了對使用的類施加強制要求,trait 支持抽象方法的使用。

Example #8 表示通過抽象方法來進行強制要求

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 的靜態成員

靜態變量可以被 trait 的方法引用,但不能被 trait 定義。但是 trait 能夠為使用的類定義靜態方法。

Example #9 靜態變量

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 靜態方法

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

輸出結果:Doing something.

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

Example #11 定義屬性

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

如果 trait 定義了一個屬性,那類將不能定義同樣名稱的屬性,否則會產生一個錯誤。如果該屬性在類中的定義與在 trait 中的定義兼容(同樣的可見性和初始值)則錯誤的級別是?E_STRICT,否則是一個致命錯誤。

Example #12 沖突

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

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕高清在线播放| 国产免费播放一区二区| 麻豆高清免费国产一区| 欧美日韩一区二区三区在线电影| 天堂av在线一区| 夜久久久久久| 午夜性色一区二区三区免费视频| 伊人影院久久| 久久三级福利| 麻豆久久一区| 美国三级日本三级久久99 | 日韩精品一级中文字幕精品视频免费观看| 久久超级碰碰| 日本精品久久| 欧美在线日韩| 在线日韩av| 亚洲一区二区免费在线观看| 精品国产aⅴ| 日韩精品亚洲一区二区三区免费| 老色鬼精品视频在线观看播放| www成人在线视频| 香蕉久久久久久| 日韩精品视频网| 欧美国产日韩电影| 久久蜜桃精品| 黄色av日韩| 最近国产精品视频| 国产伦精品一区二区三区千人斩| 日韩深夜视频| 国产在线欧美| 蜜桃av一区二区| 日韩国产欧美三级| 国产一区二区三区日韩精品| 久久只有精品| 亚洲黑丝一区二区| 亚洲精品成a人ⅴ香蕉片| 欧美亚洲二区| 久久精品一本| 黄色av一区| 亚洲日本在线观看视频| 精品美女久久| 精品精品久久| 国产欧美精品| 中文精品电影| 亚洲精品网址| 香蕉成人av| 国产成人精选| 亚洲色图综合| 天堂√8在线中文| 红桃视频国产精品| 亚洲国内欧美| 在线观看视频免费一区二区三区| 136国产福利精品导航网址| 久久最新视频| 日韩av有码| 日韩中文字幕av电影| 久久永久免费| 亚洲在线免费| 精品国产aⅴ| 免费在线观看成人| 美女国产精品久久久| 夜久久久久久| 国产精品不卡| 日韩影片在线观看| 91精品精品| 国产欧美大片| 性色一区二区| 国产精品国产一区| 亚洲欧美专区| 久久亚洲人体| 精品三区视频| 亚洲精品无吗| 亚洲福利免费| 麻豆久久一区二区| 日本一区二区中文字幕| 99久久激情| 国产精品欧美一区二区三区不卡| 亚洲男女自偷自拍| 日韩精品dvd| 欧美韩一区二区| 石原莉奈在线亚洲二区| а√天堂中文在线资源8| 国产视频一区欧美| 午夜精品成人av| 久久黄色影视| 日韩专区视频网站| 一本一道久久a久久精品蜜桃| 里番精品3d一二三区| 亚洲深深色噜噜狠狠爱网站| 日韩伦理一区| 欧美激情日韩| 亚洲欧美一级| 国产手机视频一区二区| 天堂网av成人| 成人免费一区| 麻豆精品久久久| 欧美伊人影院| 国产精品日韩久久久| 亚洲成人二区| 国产suv精品一区| 欧美激情国产在线| 日韩av成人高清| 日本欧美国产| 日韩欧美久久| 蜜桃视频第一区免费观看| 国产亚洲久久| 日韩精品亚洲专区| 日韩中文字幕av电影| 亚洲天堂久久| 国产精品不卡| 成人午夜亚洲| 精品久久不卡| 91综合久久爱com| 亚洲精品少妇| 亚洲婷婷丁香| 日韩在线观看一区二区| 91精品推荐| 九九精品调教| 久久久国产精品一区二区中文| 国产一区二区三区探花| 欧美黄页在线免费观看| 国产精品a久久久久| 国产精品亚洲欧美日韩一区在线 | 丝袜诱惑制服诱惑色一区在线观看 | 色婷婷色综合| 久久影院一区二区三区| 久久一区国产| 精品视频在线你懂得| 国产一区二区三区四区二区| 成人午夜亚洲| 久久久777| 最新日韩av| 国产亚洲福利| 一区二区三区四区日韩| 婷婷综合国产| 欧美日韩一区自拍| 国产剧情一区| 狠狠久久伊人| 久久九九99| 午夜国产精品视频| 一区福利视频| 日韩一区二区三区免费视频| 日韩国产在线观看一区| 久久激情av| 高清一区二区三区av| 色综合www| 在线观看精品| 久久精品动漫| 老牛国产精品一区的观看方式| 人人爽香蕉精品| 日本免费新一区视频| 久久99精品久久久野外观看| 久久精品国产99国产精品| 97精品中文字幕| 欧美 日韩 国产精品免费观看| 国产精品美女久久久| 日本a级不卡| 国产成人调教视频在线观看| 日韩一区二区三区免费| 欧美a级片一区| 一区二区国产在线| 国产精品午夜av| 国产黄大片在线观看| 蜜桃tv一区二区三区| 亚洲综合不卡| 国产精品九九| 日本欧美不卡| 日韩中文字幕av电影| 国产日韩在线观看视频| 国产v日韩v欧美v| 首页亚洲欧美制服丝腿| 国产日韩在线观看视频| 久久男人av资源站| 午夜在线精品| 国产精品亚洲综合在线观看| 日韩精品午夜| 日韩av一区二区三区四区| 蜜桃精品视频| 99riav1国产精品视频| 91精品国产经典在线观看| 日韩国产欧美| 天堂av一区| 欧洲av一区二区| 天使萌一区二区三区免费观看| 欧美a级一区二区| 99久久九九| 婷婷亚洲成人| 日韩电影免费在线观看| 亚洲欧美日韩综合国产aⅴ| 国产精品v一区二区三区| 亚洲午夜视频| 欧美在线观看天堂一区二区三区| 麻豆精品少妇| 免费看黄色91| 国产+成+人+亚洲欧洲在线| 亚洲色诱最新| 色综合狠狠操| 18国产精品| 国产免费成人| 色在线视频观看|