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 ...
随机推荐
- 各种sqlite管理工具
sqlite管理工具 平台 下载链接 sqlitestudio 支持多平台 https://sqlitestudio.pl/index.rvt?act=download sqlitespy windo ...
- mac 下mysql安装
系统环境: OS X Yosemite 10.10.3 登录用户: fx (有 sudo 权限) MySQL版本: 5.5.49 (mysql-5.5.49-osx10.9-x86_64.tar) M ...
- python学习-迭代器,列表解析和列表生成式
迭代器为类序列对象提供了一个类序列的接口.Python 的迭代无缝的支持序列对象,而且还允许程序猿迭代非序列类型,包括用户定义的对象. 迭代器是一个next()方法的对象,而不是通过索引计数.当需要下 ...
- 【原创】Arduino、arm、树莓派与单片机
Arduino是一个由开源软件环境支持的开源硬件原型平台.包含硬件(各种型号Arduino板)和软件(Arduino IDE).集成开发环境是Arduino IDE ,编写和编译sketch后通过US ...
- CentOS6.5 安装vncserver实现图形化访问
一. 安装gnome图形化桌面 #yum groupinstall -y "X Window System" #yum groupinstall -y "Desktop& ...
- 29.求3x3的整数矩阵对角线元素之和
#include <stdio.h> #include <stdlib.h> int main() { ,a[][]; ;i<;i++) { ;j<;j++) sc ...
- python3+cv2+andiord安卓摄像头
#coding=utf-8import cv2 import time if __name__ == '__main__': cv2.namedWindow("camera",1) ...
- Java中语法与C/CPP的区别
static不能在成员方法中定义,只能作为类变量定义.
- EL(Expression Language)表达式语言
EL(Expression Language)表达式语言 EL的基本语法是以${开始,以}结束 为了能够方便地输出数据,EL提供了11个内置对象,其中 2个内置对象为了方便输出请求参数 param用来 ...
- Zedboard搭建Linux嵌入式环境
ZYNQ是ARM硬核和PL软核的结合体,Xillybus官方为他开发了驱动套件Xillinux,赶快将开发板投入使用吧! 本随笔参考了众多博主和官方教程:(基本上就是把官方教程翻译了一遍,呵呵:)) ...