在php的面向对象开发中,咱们常常会遇到这样的一种状况:php
有两个类 teacher 和 pupil类这两个类都有以下的一些属性this
age,sex,address,school,email等。为此,咱们抽象出了一个父类为 human类code
<?php #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...开发
这样的状况下 咱们怎么处理呢?get
有的人说把相应的公用的代码和human类再进行一次的抽象 提取中公用的一个类 好比creature中!it
造成这样的一种结构:io
这样的处理方式是显然可行的,可是出现了一种问题就是类会愈来愈多,使得系统显得无比的庞大和臃肿!举例来说未来又增长了一个玩具toys进来,有诸如function
shape color name 等属性的话!咱们只能接着扩展相应的类并继续的提取公用属性 并抽象父类
极可能造成这样的一种结构:
很显然随着系统的升级,类会愈来愈多,愈来愈不利于维护!
怎么样解决上面的问题呢?
在php5.4中 引入了traits,traits究竟是个什么东西呢?官方给的解释以下:Traits 是一种为相似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减小单继承语言的限制,使开发人员可以自由地在不一样层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减小复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。
Traits能够理解为一组能被不一样的类都能调用到的方法集合。但Traits不是类!不能被实例化。
以上面的例子说明以下:
<?php 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类便可!
我的看法,多有谬误,欢迎指正!转载请说明出处,谢谢!