PHP中的traits简单理解
Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。先来例子看下语法:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
 | 
<?phptrait myTrait{  function traitMethod1(){}  function traitMethod2(){}}//然后是调用这个traits,语法为:class myClass{  use myTrait;}//这样就可以通过use myTraits,调用Traits中的方法了,比如:$obj = new myClass();$obj-> traitMethod1 ();$obj-> traitMethod2 (); > | 
接下来,我们探究下为什么要用traits,举个例子,比如有两个类,分别为business(商务者)和Individual(个人),它们都有地址的属性,传统的做法是,再抽象出一个这两个类都共同有特性的父类,比如client,在client类中设置访问属性address,business和individual分别继承之,如下代码:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
// Class Client class Client {   private $address;   public getAddress() {     return $this->address;   }      public setAddress($address) {     $this->address = $address;    } }     class Business extends Client{   //这里可以使用address属性 } // Class Individual class Individual extends Client{ //这里可以使用address属性 }  | 
但假如又有一个叫order类的,需要访问同样的地址属性,那怎么办呢?order类是没办法继承client类的,因为这个不符合OOP的原则。这个时候traits就派上用场了,可以定义一个traits,用来定义这些公共属性。
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
 | 
// Trait Addresstrait Address{  private $address;  public getAddress() {    eturn $this->address;  }  public setAddress($address) {    $this->address = $address;  }}// Class Businessclass Business{  use Address;  // 这里可以使用address属性}// Class Individualclass Individual{  use Address;  //这里可以使用address属性}// Class Orderclass Order{  use Address;  //这里可以使用address属性}    | 
这样就方便多了!
PHP中的traits简单理解的更多相关文章
- 对Django框架中Cookie的简单理解
		
概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...
 - 对C#中事件的简单理解
		
对于C#中的事件,我举了个简单的例子来理解事件及其处理. 这个例子中母亲是事件的发布者,事件是吃饭了.儿子和父亲是事件的订阅者,各自的Eat方法是处理事件的方法. 下面是详细的加注的例子: using ...
 - 对JSP中的Session 简单理解
		
我的理解: 简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid. 下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的 ...
 - java中volatile的简单理解
		
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...
 - golang中GOPATH的简单理解
		
1.为什么要配置GOPATH 配置GOPATH的用意是为了方便项目的部署和构建,以及可以直接使用go get 命令下载第三方的包到自己的项目的src下和相关的执行文件bin目录,和中间文件pkg sr ...
 - 事件循环:微任务和宏任务在v8中实现的简单理解
		
微任务 在js中,当使用promise,会将当前任务加入事件执行的微任务队列,有且只有这一种方法可以,因为当使用了promise,在JS引擎中会触发VM::queueMicrotask,会向m_mic ...
 - java中的二进制运算简单理解
		
package test9; public class StreamTest { public static void main(String[] args) { int a = 15;// 0b11 ...
 - 简单理解Struts2中拦截器与过滤器的区别及执行顺序
		
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
 - 简单理解ECMAScript2015中的箭头函数新特性
		
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
 
随机推荐
- MayBatis与Spring的整合
			
1. 步骤 第一步:导入相关的jar包(spring和mybatis) mybatis-spring-*.jar spring-jdbc-*.jar spring-tx-*.jar 第二步:sprin ...
 - (转) MapReduce Design Patterns(chapter 5 (part 2))(十)
			
Replicated Join Pattern Description 复制join是一种特殊的join,用于一个大数据和许多小数据集map端执行的情况. Intent 这种模式能够消除reduce阶 ...
 - Python中基本的读文件和简单数据处理
			
Python中基本的读文件和简单数据处理 暂无评论 DataQuest上面的免费课程(本文是Python基础课程部分),里面有些很基础的东西(csv文件读,字符串预处理等),发在这里做记录.涉及下面六 ...
 - js之自定义右键菜单
			
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - Why I am not afraid of AI (TBC)
			
Freud! Yes, according to Freud's theory, most human activities are driven by libido (or aim-inhibite ...
 - BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)
			
题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每 ...
 - stm32寄存器版学习笔记05 PWM
			
STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...
 - BZOJ2753 SCOI2012 滑雪与时间胶囊 【最小生成树】*
			
BZOJ2753 SCOI2012 滑雪与时间胶囊 Description a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有 ...
 - BZOJ2095 POI2010 Bridges 【二分+混合图欧拉回路】
			
BZOJ2095 POI2010 Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个小岛 ...
 - 【模板】NTT
			
NTT模板 #include<bits/stdc++.h> using namespace std; #define LL long long const int MAXL=22; con ...