1、php中的trait是啥?

  看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

2、PHP版本要求:

  php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。

3、trait的使用场景:

  试想这样一种情况,当有一个方法需要在很多的类中使用时,该怎么处理?
  通常一般的处理方式会是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。

  这是一种处理方法,但不是最好的处理方式。通常采用继承的情况是:几个类具有很大的相似性。比如人作为一个基类,学生、工人、等继承“人”这个基类来扩展。

  由此,trait的作用就出来了,trait 可以在多个类中使用。

4、trait如何使用:

  引用PHP手册中的例子:

  例子一

<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
} class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
} class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>

1、先声明一个trait;
2、在类中使用use将该trait引入。
  是不是非常简单(手动逃)?需要注意的是trait的优先级。

5、trait的优先级

  (敲黑板)从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

  优先级:自身方法>trait的方法>继承的方法(就是这样子的。)

看例子

  

<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
} class TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
} $o = new TheWorldIsNotEnough();
$o->sayHello();//输出是 Hello Universe!
?>

还有一点需要注意的是:多个trait的使用。

<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
} trait World {
public function sayWorld() {
echo 'World';
}
} class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
} $o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

  总结:Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

关注微信公众号:lovephp

最新文章

  1. C#学习系列-out与ref的区别
  2. 使用Apache2配置多个站点
  3. All thanks
  4. 近期学习js总结
  5. EasyUI ComboBox默认值
  6. Microsoft SQL Server 获得本地帮助方法
  7. c语言数组小练习
  8. atomic_compare_exchange
  9. wpf 界面线程 添加项
  10. 双击td字段,出现编辑文本框(更改之后发送数据请求) jsp
  11. Eclipse中配置约束(DTD,XSD)
  12. Using INSERT IGNORE with MySQL to prevent duplicate key errors
  13. redis订阅发布消息操作本地缓存
  14. html之css选择器学习
  15. 解决64bit不能连接access的问题
  16. springmvc02,使用注解
  17. sql使用实例
  18. burpsuite的使用(一)
  19. C++中,关于#include&lt;***.h&gt;和#include&quot;***.h&quot;的区别
  20. Jenkins构建时提示maven版本问题

热门文章

  1. 安装lombok(eclipse)
  2. 《ArcGIS Runtime SDK for Android开发笔记》——(12)、自定义方式加载Bundle格式缓存数据
  3. 关于scheduleAtFixedRate方法与scheduleWithFixedDelay的使用
  4. API 的历史
  5. check_mk的性能案例
  6. 三个方法教会你win7中IIS7配置php环境
  7. Android笔记之 图片自由裁剪
  8. POJ Treasure Exploration 【DAG交叉最小路径覆盖】
  9. 【luogu P2002 消息扩散】 题解
  10. Tomcat+Oracle配置连接池的例子