Trait 总结-用法-特点-坑-面试题划重点

未匹配的标注

Trait 总结-用法-特点-坑-面试题划重点

学习文章

xueyuanjun.com/post/4281

trait是啥?

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

前生

Trait是PHP 5.4引入的新概念。

出现的目的

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。

具体可以看为什么使用trait? 在下面。

解释:
Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

特点

  1. Trait能够把模块化的实现方式注入多个无关的类中
  2. 从而提高代码复用
  3. 符合DRY(Don’t Repeat Yourself)原则。

trait 与 class的区别?

  1. 看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中
  2. Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。
  3. 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

术语:java-细粒度
所谓细粒度的划分就是在pojo类上的面向对象的划分,而不是在于表的划分上 例如:在三层结构中持久化层里面只做单纯的数据库操作

作用

  1. 表明类可以做什么;
  2. 提供模块化实现。

为什么使用Trait

PHP语言使用一种典型的单继承模型,在这种模型中,我们有一个 支付基类 basePay ,然后扩展这个 basePay ,4个更加具体的子类,alipay,wxpay等。
这就叫做继承层次结果。

这足以应对大多数情况,但是如果你让两个无关的PHP类具有类似的行为呢?难道再定义类?继承?

trait 可以实现。

Trait能够把模块化的实现方式注入多个无关的类中,从而提高代码复用,符合DRY(Don’t Repeat Yourself)原则。

(接上一题)trait的使用场景

试想这样一种情况,当有一个方法需要在很多的类中使用时,该怎么处理?

通常一般的处理方式会是,写一个基础类,在基类中实现这个方法,然后所有类都继承这个基类。

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

由此,trait的作用就出来了,trait 可以在多个类中使用。让两个无关的PHP类具有类似的行为

怎么用?

如何创建Trait

关键字: 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的优先级。

注意事项!(面试常问)

trait的优先级

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

优先级自身方法>trait的方法>继承的方法

注意有坑: 方法可以覆盖,但属性不行,如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。

关联面试题: trait 定义了属性 payStatus,如果调用类,也定义了 payStatus,会不会报错?
答: 会啊。

多个trait的使用。

通过 use 直接多个引入。 use Hello, World;

使用多个Trait的命名冲突问题

  1. 使用insteadof关键字

  2. 使用as关键字为方法起个别名

laravel 中的使用trait 例子

Laravel的登陆注册控制器,去看吧,全是。这下你就能看懂一点源代码了哈哈。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
wangchunbo
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~