PHP中的traits简单理解

Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。先来例子看下语法:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?php

trait 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 Address

trait Address{

  private $address;

  public getAddress() {

    eturn $this->address;

  }

  public setAddress($address) {

    $this->address = $address;

  }

}

// Class Business

class Business{

  use Address;

  // 这里可以使用address属性

}

// Class Individual

class Individual{

  use Address;

  //这里可以使用address属性

}

// Class Order

class Order{

  use Address;

  //这里可以使用address属性

}  

这样就方便多了!

时间: 2024-10-11 23:08:44

PHP中的traits简单理解的相关文章

架构设计中服务层的简单理解

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 在ddd设计中我们经常会提到服务层,服务层是什么?职责是什么?有什么好处?. 先看简单的层次图(注:这里并没有考虑其他多余的领域逻辑数据层存储,或者UOW这些细节) 我的理解是服务层是处于我的应用程序业务层和表现层之间的应用程序边界,边界可能是很薄的一层类设计或者是分布式服务网络跃点.它是一个与技术无关的名词.由表现层直接调用,契约,执行命令(修改状态(CUD))或者是查询返回dto(数据迁

对Django框架中Cookie的简单理解

概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在你一次请求结束后她会很快忘掉你的,对她来说你的每一次请求都是新鲜的,这要是爱情就好了哈,可以爱情保鲜!闲话不多说,这种状态就是所谓的 "浏览器请求服务器是无状态",根本原因就复杂一些了,需要简单了解些网络编程中套接字Socket的通信方式,简单来说就是,浏览器和服务器进行通信需要使用Soc

java中构造方法的简单理解(转)

构造方法就是与类同名的那个方法,它的作用是可以用来初始化class Person //人类{public Person(String n,int a) //构造方法 { name = n; age = a;} private string name; private int age;}static void main(String[] args){Person p = new Person("张三",14);//这就是作用}new一个对象的时候要用到构造函数,例如Hello hello

java中的二进制运算简单理解

package test9; public class StreamTest { public static void main(String[] args) { int a = 15;// 0b1111 int b = 8;// 0b1000 boolean bool1 = true; boolean bool2 = true; System.out.println(a ^ b);// 0b1111 ^ 0b1000 = 0b0111 一边为1则取1,其余取0 结果:7 System.out.

c语言中对可变参数列表的简单理解

函数原型中一般情况下参数的数目是固定的,但是如果想在不同的时候接收不定数目的参数时该怎么办呢?c语言提供了可变参数列表来实现. 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h的头文件中.头文件中声明了一个va_list类型和va_start.va_arg.va_end三个宏.我们使用可变参数列表的时候需要声明一个va_list类型的变量配合这三个宏使用. va_start(va_list变量名,省略号前面最后一个有名字的参数):在提取可变参数前必须调用这个宏实现初始化. va_arg

如何简单理解Python中的if __name__ == &#39;__main__&#39;:

简单概括: if __name__ == '__main__': 在模块里面用于放测试代码,因为导入模块就会执行模块的代码,但是模块的测试代码我们是不需要执行的,我们只需要模块的功能,这是就要用到if __name__ == '__main__': 当别人调用这个模块的时候if__name__就不等于"__main__"了 __name__是模块的路径了,所以if__name__是不等于__main__的,不满足条件,不执行if __name__ == '__main__':下面的代码

php类的封装、继承和多态的简单理解

.面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象: 我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性  封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作.  php提供了三种访问控制修饰符  public 表示全局,本类内部,类外部,子类都可以访问  protected 表示受保护的,只有本类或子类可以访问  pr

简单理解计算机通信

简单理解计算机通信 写在前面: 在计算机刚出现的时候,只能在本机进行一些运算处理,想将一台计算机中的数据转移到另一台计算机中,需要通过外部存储介质来传输,例如磁带.软盘.而网络技术的出现,使得计算机间可以通过一些传输介质(网线.光纤等),实现快速的数据传输和信息交互.如今,网络已无处不在,那么,计算机之间究竟是如何通信的呢?下面会通过一些基础的网络知识来简单理解计算机之间的通信过程. 网络通信模型: 网络通信模型是一种概念模型和框架,旨在使各种计算机在世界范围内互连为网络.其中有OSI七层模型和

Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,