单继承语言的救星?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的使用场景有限,但它能降低代码复杂度,提高代码可读性,因为你只需在trait中编写方法,然后在需要使用它的类中声明它即可。所以,不妨一试!

最后

我已上线“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、搭建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:https://sekarakulab.beyondjapan.com/

如果您觉得这篇文章对您有帮助,请点个“赞”!
2
加载中...
2票,平均分:1.00/12
11,597
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

山田由纪

我于2021年加入Beyond Inc.。
我的爱好包括卡拉OK和桌游。
我的桌游已经多到放不下所有的桌游了,所以我想买一套新的,但是家里没地方放,这让我很沮丧。
我之前有过模具设计和销售方面的经验,在成为服务器端工程师之前积累了丰富的经验。
目前,我主要使用PHP和Python进行服务器端开发。
未来,我想学习前端语言,我对基于React的前端框架Next.js很感兴趣。