单继承语言的救星?PHP traits详解!

感谢你们的辛勤付出!
我是系统开发部的山田。
这次,我们将解释 PHP 5.4.0 中引入的 traits,它用于重用代码。
什么是特征?
特性(Traits)在 PHP 5.4.0 中引入,是一种在单继承语言中重用代码的机制。
通过将一组方法组合成一个特性,并在类中声明它们的使用,这些特性就可以像类方法一样使用,而无需继承。
特征的产生原因
PHP 类有一种称为继承的机制
,它是一种在创建新类的同时继承现有类的内容的机制。
继承消除了编写相同代码的需要,但这种继承每个类只能有一个继承,如果你想在不同的类中使用多个方法,继承关系可能会变得很复杂,难以处理。
特性(Traits)的诞生正是为了解决这个问题。
通过将方法分组到特性中,并使其只需在类中声明即可使用,可以降低单一继承带来的复杂性。
如何使用
如何创建特性
特性 特性名称 { 公共函数 方法名称1() { 处理 } 公共函数 方法名称2() { 处理 } }
如何在课堂上使用它
类名 { 使用创建的 trait 名称; // 类处理继续 }
检查实际代码
让我们实际编写代码并检查它是否有效。
需要检查的内容如下。
- 你的类方法是否运行正常?
- 继承的类方法是否正常工作?
- 在类中声明状态时,它能正常工作吗?
为了实现这个目标,我想创建一个如同神明般强大的英雄。
在创建人类角色时,我只会定义名字和身高,除了人类的特征外,这位英雄还将能够使用剑。
我还想通过添加诸如“腿速更快”、“体格更强壮”之类的体能强化特征来打造一个强大的英雄。
代码流程如下:
- 创造一个身体强壮的状态
- 创建一个继承自人类类的英雄类
- 将创建的状态继承到英雄类,并检查它是否真的有效。
trait EnhancedBody { public function fastRunner() { echo '跑得更快'; } public function strongBody() { echo '身体更强壮'; } } class Human { public $name; public $height; public function __construct($name) { $this->name = $name; $this->height = rand(140, 190); } public function status() { echo "姓名:{$this->name},身高:{$this->height}"; } } class Swordsman extends Human { use EnhancedBody; public function swingTheSword() { echo "挥剑"; } }
上述代码运行结果如下所示。
// 创建一个英雄类 $taro = new Swordsman('taro'); // 执行人类类中定义的方法 $taro->status(); // 姓名:taro,身高:150 // 执行英雄类中定义的方法 $taro->swingTheSword(); // 挥剑 // 执行强化体能状态中定义的方法 $taro->fastRunner(); // 提升奔跑速度 $taro->strongBody(); // 增强体能
既然我们已经能够创造出更强大的英雄,我们可以看到我们可以使用类方法、继承的类方法和声明的状态方法。
概括
这次,我们讲解了trait,一种在单继承语言中重用代码的机制。
虽然它的适用范围有限,但你只需在trait中编写一个方法,然后在你想使用的类中声明使用即可。这可以降低代码复杂度,使其更易于阅读,所以我们鼓励你尝试一下!
最后
我创办了一个名为“SEKARAKU Lab”的系统开发服务网站,我本人也在该公司工作。Beyond
可以处理从服务器设计、构建到运维的所有事宜,因此如果您在服务器端开发方面遇到任何问题,请随时与我们联系。SEKARAKU
Lab: https://sekarakulab.beyondjapan.com/
1