PHP中的traits快速入门
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快速入门的更多相关文章
- Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN
快速入门 使用 Spark Shell 进行交互式分析 基础 Dataset 上的更多操作 缓存 独立的应用 快速跳转 本教程提供了如何使用 Spark 的快速入门介绍.首先通过运行 Spark 交互 ...
- SD卡中FAT32文件格式快速入门(图文详细介绍)【转】
本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...
- SD卡中FAT32文件格式快速入门(图文详细介绍)
说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...
- nginx在asp.net mvc项目中 配置 初步快速入门
nginx 官方下载地址 http://nginx.org/en/download.html 一般.net项目要运行在IIS环境下,自然选择windows版下载 我这里下载了nginx/Windows ...
- Mybatis学习(一) - 快速入门
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装. MyBatis可以使用简单的XML或注解用 ...
- ElasticSearch实战系列六: Logstash快速入门和实战
前言 本文主要介绍的是ELK日志系统中的Logstash快速入门和实战 ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...
- ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解
前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...
- JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门
2 JSP内置标签(美化+业务逻辑) 1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容 2)JSP内 ...
- 第17章 社区快速入门和模板 - Identity Server 4 中文文档(v1.0.0)
IdentityServer组织不维护这些示例.IdentityServer组织愉快地链接到社区模板,但不能对模板做出任何保证.请直接与作者联系. 17.1 各种ASP.NET核心安全样本 https ...
随机推荐
- java 学习笔记
charAt(1) ;返回下表为1 的 length 返回长度 indexOf("XXX")返回XX在的位置(开始位置) startWith() y以什么开始 endWith()以 ...
- nginx申请并配置免费https
你还在让你的网站裸奔在网络上吗?在这里我们将搭建免费版HTTPS,免费的,免费的,免费的,重要的事情说三遍,申请来源为letsencrypt, 超文本传输协议HTTP协议被用于在Web浏览器和网站服务 ...
- 浅谈java中的String、StringBuffer、StringBuilder类的区别以及关系
在java中最常见的使用就是对字符串的操作:首先先说一下对字符串的理解:字符串就是一连串字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供一系列方法来操作字符串对 ...
- 记一次idea启动tomcat后控制台乱码的坑
IDEA的编码配置大致跟<IntelliJ IDEA 控制台中文乱码解决方案>一样 但是启动后依旧乱码!why? 后来想起来,之前因为在win10控制台下跑tomcat乱码,所以,改过一个 ...
- Pytorch 报错总结
目前在学习pytorch,自己写了一些例子,在这里记录下来一些报错及总结 1. RuntimeError: Expected object of type torch.FloatTensor but ...
- Installshield创建快捷方式不能正常运行的几种原因
Installshield软件提供创建快捷方式的功能,但是经常有朋友发现创建了以后快捷方式不能运行,在此列一下几种常见原因供各位朋友参考: 1. 没有选择相应的working directory,这种 ...
- Spring Boot程序的执行流程
Spring Boot的执行流程如下图所示:(图片来源于网络) 上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置 ...
- 使用[].forEach.call()方法的写拖拽排序。
---恢复内容开始--- }); });}要引用两个插件: <script src="./jquery.1.12.4.min.js"></script> & ...
- Spring(转载一)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 【转存】阿里云服务器下 LAMP 环境配置 —— 基于 CentOS 6.3
阿里云服务器下 LAMP 环境配置 —— 基于 CentOS 6.3 Posted on 2016年2月10日 by 学院君 1.Apache 配置 —————————————————– vi / ...