文档章节

php中traits的理解和使用

王景华
 王景华
发布于 2015/12/28 17:49
字数 1046
阅读 15
收藏 0

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

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

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

<?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...

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

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

形成这样的一种结构:

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

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类即可!

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

© 著作权归作者所有

共有 人打赏支持
王景华
粉丝 2
博文 7
码字总数 4297
作品 0
松江
高级程序员
私信 提问
PHP traits (复用机制)

最近在学习Laravel中,遇到了很多关于Traits ,查了下资料,分享下。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比...

Coding_ff
2017/05/27
0
0
php trait 简明教程,多重继承的实现方案

http://php.net/manual/en/language.oop5.traits.php 自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。 Traits是一种为类似PHP的单继承语音而准备的代码复用机制。Trait为了减少单...

雪之丞
2016/03/28
53
0
PHP中的traits

PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好。其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西。 Traits可以理解为一组能被不...

Surjur
2015/12/15
29
0
PHP之Traits

【PHP之Traits】  1、Traits基础      2、优先级:当前类中的方法会覆盖 Trait 方法,而Trait方法覆盖了基类中的方法。   3、多个Traits,使用use声明列出多个Traits。      4、...

行走的螃蟹
2016/08/24
12
0
STL — SGT STL的私房菜: __type_traits

SGT STL的私房菜: type_traits traits的编程技法非常的6,我们在前面的迭代器设计思维的时候已经领教过了,它适当的弥补了C++语言本身的不足. STL只对迭代器加以规范,制定 出iteratortrait...

Dawn_sf
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
14
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
19
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
19
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
9
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部