在php的面向对象开发中,我们经常会遇到这样的一种情况:

有两个类 teacher 和 pupil类这两个类都有如下的一些属性

age,sex,address,school,email等。为此,我们抽象出了一个父类为 human类

#traits 是 php5.4 中新引入的一个特性

class human{

public $name;

public $age;

public $sex;

public $address;

public $school;

public $email;

public function __construct(){

// :todo

}

public function setName($name){

$this->name = $name;

}

public function setSex($sex){

$this->sex = $sex;

}

public fucntion getSex(){

return $this->sex;

}

public function getName($name){

return $this->name;

}

// .....

}

class teacher extends human{

protected $salary;

public function teach(){

//....

}

public function getSalary(){

return $this->salary;

}

}

class pupil extends human{

protected $schoolAge;

public function learning(){

//....

}

public function getSchoolAge(){

return $this->schoolAge;

}

}

?>

上面的代码对以上的场景显然是合适的,但是现在我们遇到这样的一种情况。现在出现了一个宠物比如说:企鹅(holly)。

企鹅(holly)的出现让上面的代码不在能公用了。

但是企鹅(holly)中又确确实实的存在某些可以上上面的类公用的某些属性:比如 name age sex 等!和一些私有的属性:color,owner...

这样的情况下 我们怎么处理呢?

有的人说把相应的公用的代码和human类再进行一次的抽象 提取中公用的一个类 比如creature中!

形成这样的一种结构:

这样的处理方式是显然可行的,但是出现了一种问题就是类会越来越多,使得系统显得无比的庞大和臃肿!举例来讲将来又增加了一个玩具toys进来,有诸如

shape color name 等属性的话!我们只能接着扩展相应的类并继续的提取公用属性 并抽象父类

很可能形成这样的一种结构:

很显然随着系统的升级,类会越来越多,越来越不利于维护!

怎么样解决上面的问题呢?

在php5.4中 引入了traits,traits到底是个什么东西呢?官方给的解释如下:Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

Traits可以理解为一组能被不同的类都能调用到的方法集合。但Traits不是类!不能被实例化。

以上面的例子说明如下:

traits Common{

public $name;

public $age;

public $sex;

public function getName(){

return $this->name;

}

public function getAge(){

return $this->age;

}

public function getSex(){

return $this->sex;

}

public function setAge($age){

$this->age=$age;

}

public function setSex($sex){

$this->sex=$sex;

}

public function setName($name){

$this->name=$name;

}

}

class human {

use Common;

public $address;

public $email;

public $school;

//............

}

class teacher extends human{

//.............

protected $salary;

public function teach(){

//....

}

public function getSalary(){

return $this->salary;

}

}

class pupil extends human{

protected $schoolAge;

public function learn(){

//....

}

public function getSchoolAge(){

return $this->schoolAge;

}

}

class pets {

use Common;

public $owner;

public $color;

public $feedOn;

}

?>

这样的情况下 当我们想扩展这个系统时,我们只需要分析这个类是不是所有的对象都可用的就可以对相应的代码进行扩展,极大的降低了代码的维护成本和难度!

举例来讲,如果我们需要增加一个全体对象都存在的id时,我们只需要扩展traits Common 中的代码!如果我们需要给pets 增加一个行动方式(爬行,飞行,游)的属性时,我们只需要扩展pets类即可!

个人见解,多有谬误,欢迎指正!转载请说明出处,谢谢!

php traits作用,php中traits的理解和使用相关推荐

  1. php钩子的作用,php中的钩子理解及应用实例分析

    本文实例讲述了php中的钩子理解及应用.分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要.它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以 ...

  2. php traits 使用,php中traits的使用

    php是单继承语言,但是如果想在一个class中实现多继承的话,可以使用traits代替. 关于使用.使用关键字trait: 从某个方面,可以理解为class,但是不能实例化 trait中可以定义pu ...

  3. php traits 使用,PHP 中 Traits 简单使用方法

    php是一种单一继承的语言,无法像java一样在一个class中extends多个基类来实现代码重用,PHP 5.4中的traits是新引入的特性,能解决这一代码重用的问题,它能让开发者在多个不同的c ...

  4. 神经网络训练中batch的作用(从更高角度理解)

    1.什么是batch batch,翻译成汉语为批(一批一批的批).在神经网络模型训练时,比如有1000个样本,把这些样本分为10批,就是10个batch.每个批(batch)的大小为100,就是bat ...

  5. javascript中 (function(){})();如何理解?

    javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...

  6. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  7. C++中关键字的理解--Static

    C++中关键字的理解---Static    目录:1.static缘起             2.static自我理解             3.static举例使用             4 ...

  8. php钩子是啥意思,php中的钩子理解及应用实例分析

    本文实例讲述了php中的钩子理解及应用.分享给大家供大家参考,具体如下: 钩子的解释 钩子定义 钩子是编程里一个常见概念,非常的重要.它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以 ...

  9. java 打开jsp文件_jsp文件怎么打开(java-web中jsp的理解)

    jsp文件怎么打开(java-web中jsp的理解)JSP:Java Server Pages.JSP是一种网页的编码格式,不同于HTML的是JSP中是由 HTML中的标签指令 和 Java逻辑代码 ...

最新文章

  1. linux系统调用劫持隐藏进程,Linux2.6内核中劫持系统调用隐藏进程
  2. MongoDB用户授权和管理
  3. apache Apache winnt_accept: Asynchronous AcceptEx failed 错误的解决
  4. ubuntu下vim与系统剪切板互相拷贝
  5. 匿名内部类使用外面的类为什么要用final型
  6. 190613每日一句
  7. 智能座舱:汽车雷达的下一个战场
  8. java工程师容易秃头吗_当程序员会容易秃头?下面这3种职业一样会秃
  9. win8.1装载windows和linux双系统
  10. ios vue 添加本地音乐_vue怎么添加音乐 vue怎么添加手机音乐
  11. SpringData JPA联表分页查询需要使用countQuery属性
  12. MATLAB中对tif格式栅格影像读取-保存
  13. bootstrap3 表单构建器_Knex - 灵活轻便的 Node.js SQL 查询构建器
  14. php和durex,做避孕的杜蕾斯突然收购奶粉厂,竟是这样的理由……
  15. lldb +debugserver调试环境部署
  16. Windows 10 的系统要求
  17. 随着XAG加密圈影响力不断增强,吸引全球最大行情站点CMC收录瑞波基因XAG
  18. Metal(一) 三角形绘制
  19. 使用python绘制wav 音频文件频谱图
  20. 噬菌体疗法治疗细菌多重耐药添一篇好文

热门文章

  1. 基于c++的简易web服务器搭建(初尝socket编程)
  2. 教授专栏18 | 黄阳光: 建网络信誉系统 增线上促销成效
  3. Plant Simulation与ABB机器人虚实结合
  4. AI:颠覆医疗行业的新技术
  5. 数据库Mysql(一)
  6. 房屋按揭贷款还款系数 20070318
  7. 28个免费漂亮的切换开关UI PSD下载
  8. 基于Python3虚拟环境安装Apache Airflow
  9. 【云驻共创】华为云IoT数据分析流程实操
  10. MacOs M1安装Homebrew 在国内最简单方法