php 中 Trait 和 继承的区别

sinmu phper 2021-12-27 19:22:17

什么是 Trait


官网是这么介绍的

在这里插入图片描述

大致和继承一样,在一个类中引用其他的类的方法,但是可以避免MiXin的问题

优先级

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

区别


  1. Class 可以被实例化,但是 Trait 不行
  2. Class 如果遇到类C继承类B,类B继承类A,这样的话每一次都需要写一个继承关系,但是一旦一个类的类型是 Trait,那么这个类的方法就可以直接被使用,而不需要直接继承

总结一句话,Trait 修饰的类不需要写 implements 来被子类继承

案例


class Say{

    public function sayHello(){
        echo 'hello';
    }
}

// 这里如果 sinmu 类需要使用 Say 这个类的方法,
// 也就是如下方式

class Sinmu extends Say{
}
$sinmu = new Sinmu();
$sinmu->sayHello();

// output: hello

如果使用 Trait 的话,那么就是如下代码

trait Say{
    public function sayHello(){
        echo 'hello ';
    }
}
class Eat{
    public function eatWord(){
        echo 'word ';
    }
}

class Sinmu extends Eat {
    use Say;
}

$sinmu = new Sinmu();
$sinmu->sayHello();
$sinmu->eatWord();


// output: hello word 

或许会问,都是调用,谁比谁高尚呢?
但是一个东西的诞生一定是为了解决另一个问题的。

如果存在以下继承关系,类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C,c++那边会出现编译报错
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lDnf3ia-1640604191732)(images/2021-12-27-19-13-54.png)]

java 和 php 只支持单继承,java可以通过接口的方式实现多继承。而 php 的 trait 就有了用处,可以在一个类里面使用多个类的方法

...全文
291 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

15

社区成员

发帖
与我相关
我的任务
社区描述
我可以对一件事情坚持下去吗
社区管理员
  • Python小叮当
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

佛系记录php的相关知识

试试用AI创作助手写篇文章吧