文档章节

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 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
PHP 5.4 beta1 发布

PHP 5.4 beta1 已于昨日发布。 PHP 的 5.4x 分支新添加了许多新的特性,如 mixin 语法“traits”、直接使用数组下标访问函数返回值 explode(",", "a,b,c,d,e")[3] 、方便调试用的内置 Webser...

ValueError
2011/09/28
361
5
STL — SGT STL的私房菜: __type_traits

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

Dawn_sf
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day58-20180816-流利阅读笔记-待学习

苹果市值破万亿,iPhone 会涨价吗? Lala 2018-08-16 1.今日导读 苹果教父乔布斯曾经说过:“活着就是为了改变世界。”虽然他在 56 岁时就遗憾离世,但他极具创新和变革的精神早已深埋进苹果...

aibinxiao
27分钟前
4
0
[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
2
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部