




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
php trait 多重继承的实现案例自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。在我理解说白了就是在继承类链中隔离了子类继承父类的某些特性(就是子类“要用父类的特性的时候”,如果trait有,就优先调用trait的方法、属性等)。var.PHP_EOL; function a() echo a.PHP_EOL; interface MyInterface function _construct(); function b();abstract class MyAbstract protected $var2 = MyAbstract_var; use MyTrait; function b() echo b.PHP_EOL; class MyClass extends MyAbstract implements MyInterface protected $var3 = MyClass_var; /也可以在这里引用,不区分继承关系 /use MyTrait; function c() echo c.PHP_EOL; $class = new MyClass();$class-a();$class-b();$class-c();输出结果MyTrait_varabc优先级从基类继承的成员被 trait 插入的成员所覆盖,来自当前类的成员覆盖 trait 的方法。class Base public function sayHello() echo Hello ; trait SayWorld public function sayHello() parent:sayHello(); echo World!; public function sayHellos() echo Hello World!; class MyHelloWorld extends Base use SayWorld; public function sayHellos() echo Hello Universe!; $o = new MyHelloWorld();$o-sayHello(); #Hello World!$o-sayHellos(); #Hello Universe!3、多个 trait通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。trait Hello public function sayHello() echo Hello ; trait World public function sayWorld() echo World; class MyHelloWorld use Hello, World;$o = new MyHelloWorld();$o-sayHello(); # Hello$o-sayWorld(); # World4、多Traits冲突的解决如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。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 Talkers use A,B B:smallTalk insteadof A; A:bigTalk insteadof B; B:bigTalk as bTalk; $o = new Talker();$o-smallTalk(); # b$o-bigTalk(); # A$os = new Talkers();$os-smallTalk(); # b$os-bigTalk(); #A$os-bTalk(); # B5、修改方法的访问控制还可以使用as语法来改变Traits中函数的访问权限属性。trait HelloRuesin public function sayHello() echo Hello Ruesin; class Hello use HelloRuesin sayHello as protected; # 修改 sayHello 的访问控制 class Ruesin use HelloRuesin sayHello as private sayHellos; # 给方法一个改变了访问控制的别名 而原版 sayHello 的访问控制则没有发生变化 $o = new Hello();$os = new Ruesin();#$o-sayHello(); # 无法访问$os-sayHello(); # Hello Ruesin#$os-sayHellos(); # 无法访问6、用Traits组成新Traits正如类能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,它能够组合其它 trait 中的部分或全部成员。trait Hello public function sayHello() echo Hello; trait Ruesin public function sayRuesin() echo Ruesin; trait HelloRuesin use Hello,Ruesin;class SayHelloRuesin use HelloRuesin;$o = new SayHelloRuesin();$o-sayHello(); #Hello$o-sayRuesin(); #Ruesin7、Trait 的抽象成员为了对使用的类施加强制要求,trait 支持抽象方法的使用。表示通过抽象方法来进行强制要求trait Hello public function sayHelloRuesin() echo Hello .$this-getName(); abstract public function getName();class HelloRuesin private $name; use Hello; public function _construct($name) $this-name = $name; public function getName() return $this-name; (new HelloRuesin(Ruesin)-sayHelloRuesin(); # Hello Ruesin8、trait 的静态成员静态变量可以被 trait 的方法引用,但不能被 trait 定义。Traits 能够为使用的类定义静态方法。trait Counter public function inc() static $c = 0; $c = $c + 1; echo $cn; public static function HelloRuesin() #return Doing something; echo Hello Ruesin; class C use Counter;$o = new C();$o-inc(); # 1$o-inc(); # 2C:HelloRuesin(); #Hello Ruesin9、Trait 定义属性文章来自如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。如果该属性在类中的定义与在 trait 中的定义兼容(同样的可见性和初始值)则错误的级别是 E_STRICT,否则是一个致命错误。Ruesins Blogtrait PropertiesTrait public $x = 1;class PropertiesExample use PropertiesTrait; #public $same = true; # Strict Standards #public $different = true; # 致命错误$example = new PropertiesExample;$example-x; # 1总结:从本质上说,trait和include文件的概念差不多trait可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修合同中合同签订与履行过程中的税收问题解析
- 商业综合体租户运营管理及物业服务合同
- 灌注桩施工劳务分包合同施工环境保护与污染治理协议
- 租赁合同担保法律效力与租赁合同终止条件
- 离婚协议书:涉及财产分配、子女抚养及情感修复方案
- 知识产权授权与转让合同-互联网内容版权
- 围棋直播运营工作总结
- 珠宝店个性化定制装修与品牌独特性塑造合同
- 高端离婚子女抚养及财产分割与监护权合同
- 人事部新员工入职培训
- 营业线施工单位“四员一长”施工安全知识培训考试题库
- 紧急采购申请单
- GA/T 1678-2019法庭科学鞋底磨损特征检验技术规范
- 《数字媒体专业认知实习》课程教学大纲
- 中西方婚礼文化差异毕业论文Word版
- 预备队员考核表
- 庆阳地区地下水供水水文地质条件评价
- 储能项目竣工报告
- 打印版唐能通
- 37°球面型管路连接件
- 择菜洗菜和切菜
评论
0/150
提交评论