定义:Trait(特征) 是 PHP 提供的一种代码复用机制,用于解决单继承的限制问题。你可以把 Trait 理解成:一组可以被多个类共享的方法集合。它不是类,也不能被实例化,只能被引入。
为什么需要 Trait?
PHP 不支持多继承(一个类只能继承一个父类),这就导致:如果多个类需要相同的方法。又不想让它们强行继承一个共同的父类(因为可能它们已经继承了别的类)
假设你现在在开发一个系统,里面有:
-
程序员类:写代码、开会
-
设计师类:画图、开会
-
产品经理类:写文档、开会
你发现:程序员、设计师、产品经理虽然工作不同,但他们都有一个共同点:都要开会!!!
你可能会想:“我写一个开会类
,让所有人继承它。”但是问题来了:程序员已经继承了一个 员工类
;设计师也已经继承了一个 员工类
;PHP 只支持单继承,不能再继承其他类!
单继承限制:一个类只能有一个父类。
那么这个时候你可以创建一个 开会 Trait,所有类直接用:
traitMeeting {publicfunctionmeeting() {echo"开会中......<br>"; }}classProgrammer {useMeeting;publicfunctionwork() {echo"写代码<br>"; }}classDesigner {useMeeting;publicfunctionwork() {echo"画图<br>"; }}classProductManager {useMeeting;publicfunctionwork() {echo"写文档<br>"; }}
结果:
-
程序员可以开会
-
设计师可以开会
-
产品经理可以开会
所有人都可以复用 开会功能,但是他们互不影响,继承结构也很干净。
Trait 的语法
Trait 的基本结构
traitTraitName {// 定义属性(可选)public$name;// 定义方法publicfunctionmethodName() {// 方法内容 }}
在类中使用 Trait
classClassName {useTraitName;}
完整基础示例
traitLogger {publicfunctionlog($message) {echo"日志记录:" . $message . "<br>"; }}classFileService {useLogger;publicfunctionsave() {echo"文件已保存<br>";$this->log("保存成功!"); }}$file=newFileService();$file->save();
use
多个 Trait。traitLogger {publicfunctionlog($message) {echo"日志:" . $message . "<br>"; }}traitValidator {publicfunctionvalidate($data) {echo"验证数据:" . $data . "<br>"; }}classService {useLogger, Validator;publicfunctionprocess() {$this->validate("表单数据");$this->log("处理完成"); }}$s=newService();$s->process();
另外,一个类可以 use
多个 Trait。
traitLogger {publicfunctionlog($message) {echo"日志:" . $message . "<br>"; }}traitValidator {publicfunctionvalidate($data) {echo"验证数据:" . $data . "<br>"; }}classService {useLogger, Validator;publicfunctionprocess() {$this->validate("表单数据");$this->log("处理完成"); }}$s=newService();$s->process();
原文始发于微信公众号(风铃情报站):trait 代码复用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论