文档章节

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
十分钟让你对C++ Traits大彻大悟

转自:http://www.cnblogs.com/pugang/archive/2012/10/17/2727378.html 最近和一个朋友闲聊的时候他对我说一个人对C++的理解很多种境界,朋友不是个喜欢吹牛的人,于是听他细说,觉得很是有...

长平狐
2013/01/11
87
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
14
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部