热搜词
发表于 2022-7-6 08:30:40 | 显示全部楼层 |阅读模式
1、php中的trait是啥?

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

2、PHP版本要求:
php5.4开始引入trait,其目的就是在于减少代码的重复,增加代码的复用性。

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

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

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

4、trait如何使用:
引用PHP手册中的例子:

例子一
  1. <?php
  2. trait ezcReflectionReturnInfo {
  3.     function getReturnType() { /*1*/ }
  4.     function getReturnDescription() { /*2*/ }
  5. }

  6. class ezcReflectionMethod extends ReflectionMethod {
  7.     use ezcReflectionReturnInfo;
  8.     /* ... */
  9. }

  10. class ezcReflectionFunction extends ReflectionFunction {
  11.     use ezcReflectionReturnInfo;
  12.     /* ... */
  13. }
  14. ?>
复制代码

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

5、trait的优先级

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

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

看例子
  1. <?php
  2. trait HelloWorld {
  3.     public function sayHello() {
  4.         echo 'Hello World!';
  5.     }
  6. }

  7. class TheWorldIsNotEnough {
  8.     use HelloWorld;
  9.     public function sayHello() {
  10.         echo 'Hello Universe!';
  11.     }
  12. }

  13. $o = new TheWorldIsNotEnough();
  14. $o->sayHello();//输出是 Hello Universe!
  15. ?>
复制代码

还有一点需要注意的是:多个trait的使用。
  1. <?php
  2. trait Hello {
  3.     public function sayHello() {
  4.         echo 'Hello ';
  5.     }
  6. }

  7. trait World {
  8.     public function sayWorld() {
  9.         echo 'World';
  10.     }
  11. }

  12. class MyHelloWorld {
  13.     use Hello, World;
  14.     public function sayExclamationMark() {
  15.         echo '!';
  16.     }
  17. }

  18. $o = new MyHelloWorld();
  19. $o->sayHello();
  20. $o->sayWorld();
  21. $o->sayExclamationMark();
  22. ?>
复制代码

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

附:以上是trait的基本使用,其还有几个比较高级的使用注意点,详细的使用方法可以参见PHP手册,这里给出链接:PHP手册中trait的使用!以上内容中的例子都是来自于该手册。

参考:
1. http://php.net/manual/zh/language.oop5.traits.php
2. http://laravelacademy.org/post/4281.html
3. http://www.jianshu.com/p/47f0cdbe9b2c
————————————————
原文链接:https://blog.csdn.net/lemony521/article/details/78322652

全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-12-27 20:12 , Processed in 0.152031 second(s), 22 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team