首页 > 作文

PHP Trait代码复用类与多继承实现方法详解

更新时间:2023-04-07 07:43:22 阅读: 评论:0

本文实例讲述了php trait代码复用类与多继承实现方法。分享给大家供大家参考,具体如下:

前言

众所周知,一直以来php和很多语言一样是单继承的语言,但是常常在编码过程中,我们需要在当前类中使用两个或两个以上的其他类的方法,这种情况下继承就不能实现,而往往采用new方式实例化很多要用到的类,这样就会很影响代码的结构和开发规范。于是trait类诞生了,它是一种代码复用的语法,能够实现一个类中引用多个其他类的方法。

一、概念

php官方手册对trait的描述是:
trait是为类似php的单继承语言而准备的一种代码复用机制。trait为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用method。trait和class组合的语义定义了一种减少复杂性的方式,避免传统多继承和mixin类相关典型问题。
trait和class相似,但仅仅旨在用细粒度和一致的方式来组合功能。无法通过trait自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个class之间不需要继承。

二、trait类的使用

简单地讲,trait就是一种不同于继承的语法,定义一个trait类,在其他类中使用它则是采用u关键字,有点类似于命名空间的用法,但是含义不同。u关键字在一个类中引入trait类后,相当于require或include了一段代码进来,不同之处在于u的trait类与当前类是可以看做同一个类的,即当前类可以用$this关键字调用trait类的方法。

以下是原理解释:

可以看出当前类可以简单地u两个trait类,并调用其中的方法,而不仅限于继承,只能使用一个父类的方法。

三、trait类的访问控制

我们知道,继承的方式,如果基类是private修饰控制的,则子类是无法调用的。但是trait不一样,因为它类似于require到当前类中了,所以不管是public、protected或private都是可以直接使用的。示例如下:

四、trait类的优先级控制

trait类与当前使用类、继承的基类之间的调用优先级顺序如下:
当前使用类>trait类>继承的基类

当存在同名方法时,会根据优先级覆盖掉同名的类。具体示例如下:

1、trait类覆盖基类

2、当前类覆盖trait类

五、多个trait类的冲突控制

在php中,如果当前类u了两个trait类,同时两个trait类都存在一个同名的方法,此时如果没有明确解决冲突将会产生一个致命错误。
对于这种情况,php官方给出了两个解决方案:
1、insteadof关键字:通过该关键字指定方法名冲突时该使用哪个trait类的方法,即:
如果c类u了a、b两个trait类,且a、b两个类都存在a、b方法,则在c类u a、b类时使用insteadof声明冲突的解决方法即可:

u a, b {  b::a insteadof a; //a方法冲突时使用b类的a方法而不使用a类的a方法  a::b insteadof b; //b方法冲突时使用a类的b方法而不使用b类的b方法}

2、as关键字:通过as关键字将同名方法指定为一个别名,且仅作用于当前类中。示例如下:

u a, b {  b::a as c; //声明b类的a方法为c,作用于该类  a::b as d; //声明新闻导语a类的b方法为d,作用于该类}

六、与继承、直接实例化的区别

对于当前一个类需要用到另一个或多个类的方法的情况,我们一般会想到的方式有继承、直接实例化另外一个或多个类等等的方法,下面来对比一下这些方法和trait类的区别:
1、继承方式:对于继承,可以完美地复用另一个类的一些方法,但是对于需要复用多个类的方法时,php是不支持多继承的,而且只能访问public和protected方法;
2、与直接实例化的区别:我们也可以在当前类中直接实例化要用到的a类与b类,但是这种方法在控制访问范围反面,只允许访问a、b类中public的方法;
3、使用trait类则完全将a、b两个类的方法导入到当前类中,可以视为当前类的一部分,唯一区别是可以存在于当前类同名的方法,此时由优先级顺序来控制。

补充:php多继承示例

class ba{  public function sayhello(){    echo "hello ";  }}trait sayworld{  public function sayhello(){    parent::sayhello();    echo "world".php_eol;  }}trait sayworld2{  public fbeneficial词组unction sayhell在职研究生含金量o2(){    echo "php".php_eol;  }}class myhelloworld extends ba{  u sayworld,农历十月初一是什么节日sayworld2;}$s = new myhelloworld();$s->sayhello();$s->sayhello2();

输出结果:

hello world
php

更多关于php相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《php数组(array)操作技巧大全》、《php基本语法入门教程》、《php运算与运算符用法总结》、《php字符串(string)用法总结》、《php云朵像什么的比喻句+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家php程序设计有所帮助。

本文发布于:2023-04-07 07:43:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/80e01d69c553539c13d14020cdf7f9a1.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP Trait代码复用类与多继承实现方法详解.doc

本文 PDF 下载地址:PHP Trait代码复用类与多继承实现方法详解.pdf

标签:方法   类中   两个   多个
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图