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 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~