traits

在学习PHP的过程中,我们经常会翻阅PHP的官方手册。一般理解能力强悍的人多阅读几遍便可轻松理解其中要领,但往往更多的初学者对官方文档中寥寥数语的描述难以理解。作为一个曾有同样困扰的人,我的经验是遇到这种情况的时候,首先使用搜索引擎翻阅他人分享的学习成果,当知其一二有了概念以后随手写下一些文档,方便巩固知识,日后在工作中有需要时再去深入细节。

traits是什么?

首先我们先对这个知识有一个基本的概念,你可以先将traits理解成类似include用于代码复用的技术,include针对的是一个类或者其他文件,而traits则是一个针对方法结构的技术,我们使用use关键字就可以将结构体引用到当前的class当中。

需求

图中一共存在五个类,分别是基类A以及其子类BCD和一个完全独立的E类,我们有两个方法getSum,getSub。我们需要在B,C,E中同时包含这两个方法,但D类中不包含。

这时候,我们第一个想法大都会是

1.在B,C,E中复制同样的代码实现这两个方法。

2.定义一个接口让B,C,E去实现。

在没有traits之前可能我们大部分人正是如此去实现需求,不管哪种方法最终的方式都是复制代码重用。

然而这些方式的弊端是

1.繁复的复制工作造成的代码冗余。

2.不具备灵活性当需要添加新的方法时每个地方都要修改,难以维护。

traits的出现正是为了解决上述问题

如何使用traits

使用traits的方式很简单,和我们定义类的方式相像,除了关键字以为其余一致。

  1. <?php
  2.  
  3. trait myCode {
  4.  
  5. public function getSum($n1, $n2) {
  6. return $n1 + $n2;
  7. }
  8.  
  9. public function getSub($n1, $n2) {
  10. return $n1 - $n2;
  11. }
  12.  
  13. }

当定义好一个结构体后我们只需要在类里面使用use关键字进行调用,根据我们上面的需求我们在B,C,E中分别use myCode这个tratis

  1. <?php
  2.  
  3. trait myCode {
  4.  
  5. public function getSum($n1, $n2) {
  6. return $n1 + $n2;
  7. }
  8.  
  9. public function getSub($n1, $n2) {
  10. return $n1 - $n2;
  11. }
  12.  
  13. }
  14.  
  15. class A {
  16.  
  17. }
  18.  
  19. class B extends A {
  20.  
  21. use myCode;
  22. }
  23.  
  24. class C extends A {
  25.  
  26. use myCode;
  27. }
  28.  
  29. class D extends A {
  30.  
  31. }
  32.  
  33. class E {
  34.  
  35. use myCode;
  36. }
  37.  
  38. $b = new B();
  39. echo 'B调用tratis中的方法成功,方法结果为:' . $b->getSum(10, 20) . '</br>';
  40. $c = new C();
  41. echo 'C调用tratis中的方法成功,方法结果为:' . $c->getSum(10, 20) . '</br>';
  42. $e = new E();
  43. echo 'E调用tratis中的方法成功,方法结果为:' . $e->getSum(10, 20) . '</br>';

在代码中我们分在每个类中调用了我们定义的方法结构,从而我们不需要在每个类中对方法进行描述,因为程序已经将tratis中的方法自动添加到了每一个类中,这样我们就见面了各种手动繁复的操作,而如果程序后期需要对这几个类拓展的时候只需要对定义的tratis进行修改就可以达到预设的目的,极大地提交了可维护性。

运行这段代码的返回结果为:

最终我们的程序结构如下

这样我们就算是对tratis进行了一个简单入门,但应该已经满足我们日常开发的需求;

如果你需要深入了解更多细节可以参阅一下文章

1.https://blog.csdn.net/qq_16142851/article/details/80437560

2.https://segmentfault.com/a/1190000008009455

PHP中的traits快速入门的更多相关文章

  1. Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN

    快速入门 使用 Spark Shell 进行交互式分析 基础 Dataset 上的更多操作 缓存 独立的应用 快速跳转 本教程提供了如何使用 Spark 的快速入门介绍.首先通过运行 Spark 交互 ...

  2. SD卡中FAT32文件格式快速入门(图文详细介绍)【转】

    本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...

  3. SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

  4. nginx在asp.net mvc项目中 配置 初步快速入门

    nginx 官方下载地址 http://nginx.org/en/download.html 一般.net项目要运行在IIS环境下,自然选择windows版下载 我这里下载了nginx/Windows ...

  5. Mybatis学习(一) - 快速入门

    MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用简单的XML或注解用 ...

  6. ElasticSearch实战系列六: Logstash快速入门和实战

    前言 本文主要介绍的是ELK日志系统中的Logstash快速入门和实战 ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  7. ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解

    前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  8. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  9. 第17章 社区快速入门和模板 - Identity Server 4 中文文档(v1.0.0)

    IdentityServer组织不维护这些示例.IdentityServer组织愉快地链接到社区模板,但不能对模板做出任何保证.请直接与作者联系. 17.1 各种ASP.NET核心安全样本 https ...

随机推荐

  1. JS属性修改

    document.getElementById('p1').style.visibility='visible' document.getElementById('p1').style.visibil ...

  2. OGNL表达式的一个坑!

    我在写Spring整合JDBC框架的时候用了properties文件去设置JDBC的参数.但是发现了一个问题先付上代码 properties文件的代码 db.driverClass=com.mysql ...

  3. 修改权限linux

    1.更改目录所有者命令:chown -R 用户名称 目录名称2.更改目录权限命令:chmod -R 755 目录名称 nginx在不同目录下需要给与全部权限才可以

  4. python 视频爬虫

    打开网址:http://mv.688ing.com/ 输入视频播放地址 发现很多链接以.ts结尾. # import requests import os def download(): header ...

  5. CSV空行问题

    当写入CSV时生成的数据会有空行如果加入 newline =‘’ 不会新增空行 writefile = open('result.csv','w',newline =‘’) 原贴 https://bl ...

  6. iBATIS typeHandler selectKey

    typeHandler 是针对把数据库里面的某列的数据类型转换的应用程序中的数据类型,简单的说就是把 type=>dbType  反之把dbType=>type. 例如数据库某列的内容是l ...

  7. [转]大白话讲解Promise(一)

    http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正 ...

  8. 关于jetbrains系列产品2018.1.5以后的使用(crack)方法

    产品请一律官网下载:https://www.jetbrains.com/ 我这里以JetBrains GoLand 2018.2.1为例说明下非付费的使用方法(若资金允许,请点击https://www ...

  9. jmeter 获取登录token

    1.在登录的请求下新建正则表达式,获取token 2.正则表达式的写法 注意:apply to 默认是选择第二个,但是有获取不到token的情况就选第一个 "accessToken" ...

  10. 查看win10系统产品密钥

    查看win10系统产品密钥 1.win+R 输入Regedit运行注册表 2.找到(在HKEY_LOCAL_MACHINE–>SOFTWARE–>Microsoft–>Windows ...