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的方式很简单,和我们定义类的方式相像,除了关键字以为其余一致。

<?php

trait myCode {

    public function getSum($n1, $n2) {
return $n1 + $n2;
} public function getSub($n1, $n2) {
return $n1 - $n2;
} }

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

<?php

trait myCode {

    public function getSum($n1, $n2) {
return $n1 + $n2;
} public function getSub($n1, $n2) {
return $n1 - $n2;
} } class A { } class B extends A { use myCode;
} class C extends A { use myCode;
} class D extends A { } class E { use myCode;
} $b = new B();
echo 'B调用tratis中的方法成功,方法结果为:' . $b->getSum(10, 20) . '</br>';
$c = new C();
echo 'C调用tratis中的方法成功,方法结果为:' . $c->getSum(10, 20) . '</br>';
$e = new E();
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. Vue语法学习第三课——计算属性

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.对于任何复杂逻辑,都应当使用计算属性. <div id="example&qu ...

  2. Asp.Net Core通过HttpStatusCode状态处理响应结果

    在我的一个Asp.Net Core 2.1 的项目中,我们需要通过获得服务器返回的状态,去实现不用的操作,经过多方资料查询和实践,个人总结一种方法 一.修改控制器 在要返回值的控制器Action中,R ...

  3. 2016/12/21 dplの课练

    1.将/etc/passwd第行的最后一段全部改成/bin/bash cat 1 |sed -n '1,$p' |egrep '.*:' -o |sed 's/$/\bin\/bash/' 2.将/e ...

  4. 前端生成水印之SVG方式

    SVG:可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式. SVG由W3C制定,是一个开放标准. (f ...

  5. 判断库中为字符串格式的时间是否为最近三个月(Java)

    今天分享一个问题,就是标题中提到的问题,今天在调用一个接口的时候,发现调用到的数据的时间格式为字符串类型,我有点蒙圈,于是,我就百度解决了这个问题,同时在这里记录一下,为了之后不再蒙圈::: 首先需要 ...

  6. WEB学习笔记12-高可读性的HTML之如何正确设计表单

    网站中的用户登录.注册.用户调查等都是通过页面中的表单提交到网站服务器的.假设要实现让用户设置个人信息的一个表单. 该表格为两栏布局,第一栏中的文本左对齐,第二栏的表单控件右对齐,构成了最容易实现的表 ...

  7. 用PHP判断是否闰年(正则匹配法)

    <?php /** * PHP判断是否闰年 */ $year="2004-02-29"; $pattern='/(([0-9]{3}[1-9]|[0-9]{2}[1-9][0 ...

  8. 正确处理下载文件时HTTP头的编码问题(Content-Disposition)

    留坑 参考: 正确处理下载文件时HTTP头的编码问题(Content-Disposition) HTTP协议header中Content-Disposition中文文件名乱码 文件下载,content ...

  9. ubuntu18.04LTS修改键盘键位

    在Linux中为了敲命令方便,所以需要做一下键盘键位调整: 1.Esc键和`(即数字键1前面的那个键)对换: 2.Caps Lock键和左Control键对换: 编辑键位文件: sudo vim /u ...

  10. java GMT时间转换为CST时间

    今天在获取windchill的“上次修改时间”的时候发现获取的是GMT时间,但是我们常用的是CST时间 一开始尝试直接设置为CST时区,TimeZone.getTimeZone("CST&q ...