【多继承】PHP使用trait或者是组合的模式来实现多继承【原创】
来源:互联网 发布:淘宝店铺数据 编辑:程序博客网 时间:2024/06/12 21:30
PHP的类继承只能是单继承,不能多继承,如果想要实现多继承的话,可以使用接口的方式来多继承,但是如果不想使用接口的方式来实现多继承的话,可以考虑使用trait来实现,当然也可以使用组合模式来实现。trait是PHP 5.4新增的代码复用的方法,
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
通常在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。
代码如下:
1
2
/**
3
* Traits可以多重继承,可以看做是一种加强型的接口
4
*/
5
6
trait Hello
7
{
8
public function sayHello()
9
{
10
echo 'Hello ';
11
}
12
13
public function aaa()
14
{
15
echo 'AAA';
16
}
17
}
18
19
trait World
20
{
21
public function sayWorld()
22
{
23
echo 'World';
24
}
25
}
26
27
class MyHelloWorld
28
{
29
use Hello, World;
30
31
public function sayExclamationMark()
32
{
33
echo '!';
34
}
35
36
// 会覆盖掉Hello中的aaa方法
37
public function aaa()
38
{
39
echo 'AAAAA';
40
}
41
}
42
43
$obj = new MyHelloWorld();
44
$obj->sayHello();
45
$obj->sayWorld();
46
$obj->sayExclamationMark();
47
$obj->aaa();
48
49
// 输出:
50
// Hello World!AAAAA
51
代码中使用两个trait来实现了多继承。
注意:两个trait中不能出现同样的方法,如果有同名的方法时,会产生致命错误。
注意:并且MyHelloWorld类中也有aaa方法,会覆盖Hello trait中的aaa方法。
上面的代码也可以通过组合的模式来实现,代码如下:
<?php/** * 使用组合的方式也可以达到 1_12_trait.php 的效果 */class Hello2{ public function sayHello() { echo 'Hello '; } public function aaa() { echo 'AAA'; }}class World2{ public function sayWorld() { echo 'World'; } public function aaa() { echo 'AAAA'; }}class MyHelloWorld2{ public $obj = []; public function __construct() { $this->obj['Hello2'] = new Hello2(); $this->obj['World2'] = new World2(); } public function sayExclamationMark() { echo '!'; } public function __call($name, $arguments) { foreach ($this->obj as $value) { if (method_exists($value, $name)) { return $value->$name(); // 也可以用 return call_user_func([$value, $name]); } } if (!method_exists($this->obj['Hello2'], $name) && !method_exists($this->obj['World2'], $name)) { echo "\r\n不存在此方法"; } return true; } // 会覆盖其他类的aaa方法 public function aaa() { echo 'AAAAA'; }}$obj = new MyHelloWorld2();$obj->sayHello();$obj->sayWorld();$obj->saywhat();$obj->aaa();$obj->sayExclamationMark();// 输出:// Hello World!AAAAA
显而易见,通过trait来实现的话代码量少得多并且可读性也要高得多。
阅读全文
0 0
- 【多继承】PHP使用trait或者是组合的模式来实现多继承【原创】
- php实现多继承-trait语法
- php学习笔记--trait的使用(为实现多继承产生)
- scala的继承、组合与特质trait
- php trait 简明教程,多重继承的实现方案
- php 多重继承的替代方案trait
- Go语言使用组合的方式实现多继承
- trait 继承的Demo
- 《JAVA继承与多态》利用继承实现MyStack,MyStack是用组合实现的。扩展ArrayLis
- 使用内部类来实现Java的”多继承“
- PHP5.4以上更新的伪"多继承"--trait语法
- 公有继承或者公有多继承是可以用::符号
- PHP 5.4 的 Trait 特性_实现类的多重继承
- PHP手册-对于单继承语言的扩展Trait
- 继承的拓展(利用组合来实现复用)
- Go是如何用组合实现继承的
- PHP实现接口多继承
- java中的状态模式-继承和组合的使用
- Up and Running with Houdini ( lynda--H14)
- FindBugs-IDEA的使用
- 采购订单BADI增强-ME_PROCESS_PO_CUST
- java数据结构与算法之(Queue)队列设计与实现
- android中的activity详解
- 【多继承】PHP使用trait或者是组合的模式来实现多继承【原创】
- 行李旅宿iOS,Android App同步上线了
- MySql 中的union,join 解析
- next_permutation求下一个排列的原理
- 最全最好用的vim设置(非常全面),即.vimrc文件的配置
- CJOJ 1494 【网络流24题】 搭配飞行员
- 【教程】Edraw Max(亿图图示)案例:产品经理如何用亿图绘制流程图?
- Max下CocosCreator编译出android的apk包
- 移动端页面的相对高度