• 技术文章 >后端开发 >php教程

    详解PHP中怎么利用Trait解决单继承问题

    青灯夜游青灯夜游2022-03-01 10:56:55转载300
    如何破解PHP单继承魔咒?下面本篇文章给大家介绍一下PHP中怎么利用Trait解决单继承问题,希望对大家有帮助。

    我们都知道PHP是单继承语言,但是有些时候我们两个在业务上毫不相干的两个类可能存在类似的行为,我们如何优雅的做到DRY(Don’t Repeat Yourself)呢?

    答案就是引入Trait

    Trait简介

    Trait是PHP 5.4引入的新概念,看上去既像类又像接口。【推荐学习:《PHP视频教程》】

    其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中。

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

    Trait作用

    单继承结构

    开篇我就提到了PHP是单继承语言,我们通常的习惯是:

    这叫方式就是单继承层次结构,很多编程语言都使用这个模式。

    大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?

    示例源码

    我查询了Laravel的源码,以自带的LoginController为例,其中的登录认证就是通过Trait实现:

    1.png

    创建Trait

    创建Trait很简单,跟创建类有点类似,只不过使用的关键字是trait而不是class,以上述的AuthenticatesUsers为例:

    2.png

    我们通过trait声明定义的是一个Trait,然后我们可以在这个Trait中像类一样定义要使用的属性和方法。

    此外Trait支持嵌套和组合,即通过一个或多个Trait(多个用,分隔)组合成一个Trait,比如AuthenticatesUsers就是如此:

    3.png

    注意:Trait中还支持定义抽象方法和静态方法,其中抽象方法必须在使用它的类中实现。

    调用方法的优先级:

    调用类>Trait>父类(如果有的话),方法可以覆盖,但属性不行。

    注意:如果Trait中定义了一个属性,如果调用类中也定义这个属性则会报错。

    使用Trait

    Trait的使用方法也很简单,上面的截图示例中已经显示的很清楚明了:使用use关键字。

    引入位置

    注意:命名空间和Trait使用的都是use关键字引入,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入

    4.png

    编译问题

    如果Trait和引用Trait的类有相同的属性和方法,我们再外部调用时需要使用instansof关键字指明方法是类的还是Trait的。

    因为PHP解释器在编译时会把Trait复制到类的定义体中,但是不会处理这个操作引入的不兼容问题,需要我们来解决兼容问题。

    更多编程相关知识,请访问:编程教学!!

    以上就是详解PHP中怎么利用Trait解决单继承问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP Trait 单继承问题
    上一篇:PHP中如何读取CSV内容并存入一个数组中 下一篇:没有了
    PHP编程就业班

    相关文章推荐

    • thinkphp中create方法怎么用• PHP中如何读取CSV内容并存入一个数组中• php怎么找到字符串的第几个字符• php怎么除去数组的健值• php怎么将数组转换为以逗号分隔符连接的字符串• php怎么判断指定键存不存在• php怎么判断值是不是int类型

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网