电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

Traits 和一個(gè)類相似,但僅僅旨在用細(xì)粒度和一致的方式來組合功能。Trait 不能通過它自身來實(shí)例化。它為傳統(tǒng)繼承增加了水平特性的組合;也就是說,應(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)先順序是來自當(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

通過逗號(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è)同名的方法,如果沒有明確解決沖突將會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤。

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

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

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 語法還可以用來調(diào)整方法的訪問控制。

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

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

正如類能夠使用 trait 一樣,其它 trait 也能夠使用 trait。在 trait 定義時(shí)通過使用一個(gè)或多個(gè) 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();

輸出結(jié)果:

Hello World!

Trait 的抽象成員

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

Example #8 表示通過抽象方法來進(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 中的定義兼容(同樣的可見性和初始值)則錯(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)文章:
主站蜘蛛池模板: 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 棉服定制/厂家/公司_棉袄订做/价格/费用-北京圣达信棉服 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 制冷采购电子商务平台——制冷大市场 | 环氧铁红防锈漆_环氧漆_无溶剂环氧涂料_环氧防腐漆-华川涂料 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 2025第九届世界无人机大会 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 领先的大模型技术与应用公司-中关村科金| ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | CPSE安博会| 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 |