文档章节

php中traits的理解和使用

王景华
 王景华
发布于 2015/12/28 17:49
字数 1046
阅读 15
收藏 0
点赞 0
评论 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 ⋅ 0

PHP中的traits

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

Surjur ⋅ 2015/12/15 ⋅ 0

PHP之Traits

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

行走的螃蟹 ⋅ 2016/08/24 ⋅ 0

PHP 自 5.2 到 5.6 中新增的功能详解[转]

本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征。 PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期...

W_Lu ⋅ 2014/02/07 ⋅ 2

STL — SGT STL的私房菜: __type_traits

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

Dawn_sf ⋅ 2017/12/23 ⋅ 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 ⋅ 5

十分钟让你对C++ Traits大彻大悟

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

长平狐 ⋅ 2013/01/11 ⋅ 0

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3...

mickelfeng ⋅ 2014/09/24 ⋅ 0

php中的traits详解

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个...

stone_ryan ⋅ 2017/05/10 ⋅ 0

篮子、水果和鸡蛋——关于C++的模板偏特化和萃取编程技法

最近在读《STL源码剖析》。读这本书的时候发现自己的C++的知识其实是非常匮乏的。 从大学的C++教材上学到一些C++基本的语法、内存管理、继承、多态等方面的基础知识。这些只是是一棵大树的根...

costaxu ⋅ 2012/12/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于线程的创建

转自自己的笔记: http://note.youdao.com/noteshare?id=87584d4874acdeaf4aa027bdc9cb7324&sub=B49E8956E145476191C3FD1E4AB40DFA 1.创建线程的方法 Java使用Thread类代表线程,所有的线程对......

MarinJ_Shao ⋅ 28分钟前 ⋅ 0

工厂模式学习

1. 参考资料 工厂模式-伯乐在线 三种工厂-思否 深入理解工厂模式 2. 知识点理解 2.1 java三种工厂 简单工厂 工厂模式 抽象工厂 2.2 异同点 逐级复杂 简单工厂通过构造时传入的标识来生产产品...

liuyan_lc ⋅ 40分钟前 ⋅ 0

Java NIO

1.目录 Java IO的历史 Java NIO之Channel Java NIO之Buffer Java NIO之Selector Java NIO之文件处理 Java NIO之Charset Java 可扩展IO 2.简介 “IO的历史”讲述了Java IO API从开始到现在的发...

士别三日 ⋅ 44分钟前 ⋅ 0

[Err] ORA-24344: success with compilation error

从txt文本复制出创建function的脚本,直接执行,然后报错:[Err] ORA-24344: success with compilation error。 突然发现脚本的关键字,居然不是高亮显示。 然后我把脚本前面的空格去掉,执行...

wenzhizhon ⋅ 54分钟前 ⋅ 0

Spring Security授权过程

前言 本文是接上一章Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 调试过程 使用debug方式启动https://github.com/longfeizheng/logback该项目,...

hutaishi ⋅ 今天 ⋅ 0

HAProxy基于KeepAlived实现Web高可用及动静分离

前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。 ...

寰宇01 ⋅ 今天 ⋅ 0

微软自研处理器的小动作:已经开始移植其他平台的工具链

微软将 Windows 10 、Linux 以及工具链如 C/C++ 和 .NET Core 运行时库、Visual C++ 2017 命令行工具、RyuJIT 编辑器等移植到其自主研发的处理器架构 E2。微软还移植了广泛使用的 LLVM C/C++...

linux-tao ⋅ 今天 ⋅ 0

JS常见this指代总结

1. dom0级事件处理程序的回调函数内 2. dom2级事件处理程序的回调函数内 3. setTimeout 4. setInterval var test = { testfn: function () { console.log(this); }};...

静默行 ⋅ 今天 ⋅ 0

泛型的基本原理

泛型是 JDK1.5 的一个新特性,其实就是一个『语法糖』,本质上就是编译器为了提供更好的可读性而提供的一种小「手段」,虚拟机层面是不存在所谓『泛型』的概念的。 在我看来,『泛型』的存在...

沧海一刀 ⋅ 今天 ⋅ 0

学好Java只需要做到这8点,年薪30W很简单!文末福利赠送!

前言: 大道至简,所以扎实有用的方法,其实都是很简单的,难在踏踏实实的执行过程。今天为大家介绍的就是Java学习的8个看起来非常简单的方法,快学起来吧。 为什么要学习Java? Java是目前最...

java高级架构牛人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部