Traits实现多继承
来源:互联网 发布:gta5怎么优化 编辑:程序博客网 时间:2024/05/21 11:23
php没有多继承,但提供很多实现多继承的解决方案,trait就是其中一种官方解释:自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。 <?phptrait ezcReflectionReturnInfo { function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ }}class ezcReflectionMethod extends ReflectionMethod { use ezcReflectionReturnInfo; /* ... */}class ezcReflectionFunction extends ReflectionFunction { use ezcReflectionReturnInfo; /* ... */}/*优先级:从基类继承的成员被 trait 插入的成员所覆盖。优先顺序是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。*/?><?php/*使用多个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();?><?php/*如果两个 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; }}?><?php/*使用 as 语法还可以用来调整方法的访问控制。 */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; }}?><?php/*正如类能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 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();?><?php/*为了对使用的类施加强制要求,trait 支持抽象方法的使用。*/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; }}?><?php/*Traits 可以被静态成员静态方法定义。*/trait Counter { public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; }}class C1 { use Counter;}class C2 { use Counter;}$o = new C1(); $o->inc(); // echo 1$p = new C2(); $p->inc(); // echo 1trait StaticExample { public static function doSomething() { return 'Doing something'; }}class Example { use StaticExample;}Example::doSomething();?><?php/*Trait 同样可以定义属性。如果 trait 定义了一个属性,那类将不能定义同样名称的属性,否则会产生一个错误。如果该属性在类中的定义与在 trait 中的定义兼容(同样的可见性和初始值)则错误的级别是 E_STRICT,否则是一个致命错误。 */trait PropertiesTrait { public $same = true; public $different = false;}class PropertiesExample { use PropertiesTrait; public $same = true; // Strict Standards public $different = true; // 致命错误}?>
0 0
- Traits实现多继承
- php使用traits实现代码复用、多继承
- php使用traits实现代码复用、多继承
- traits
- traits
- traits
- Traits
- Traits
- PHP中的traits之二(trait继承中的优先级)
- traits 的pattern 方法实现strategy adapter
- C++ traits和enable_if的实现
- PHP使用traits实现代码复用
- PHP使用traits实现代码复用
- Java 实现多继承
- java实现多继承
- java实现多继承
- oc实现多继承
- lua 多继承实现
- Socket编程
- 我是一个人
- 做技术牛人
- MySQL分组排序取前N条记录 以及 生成自动数字序列 的SQL
- 卫星影像的公开与泄密
- Traits实现多继承
- 文件的输入与输出(二)
- Android 关机界面添加重启菜单功能
- jQuery中json对象的复制方式介绍(数组及对象)
- SVM学习笔记(1 )LIBSVM中的核函数及其参数
- GoogleDrive----如何获得文件的全路径
- cmd杀进程 杀8080端口
- Asp.net 定时任务
- 你说你很爱这首诗,我说我也有首很爱的诗