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

PHP

感谢你们的辛勤付出!
我是系统开发部的山田。

这次,我们将解释 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
加载中...
1票,平均分:1.00/11
11,490
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

山田由纪

于2021年加入Beyond Inc.。
他的爱好是卡拉OK和桌
游。他想买个新架子,因为他所有的桌游都放不下了,但遗憾的是家里没有地方放。
他之前有过模具设计和销售方面的经验,积累了丰富的经验,目前担任服务器端工程师。他
现在使用PHP和Python进行服务器端开发。
他希望将来学习一门前端语言,并且对基于React的前端框架Next.js很感兴趣。