首页 > 编程语言 >PHP trait使用

PHP trait使用

时间:2023-05-09 11:57:23浏览次数:31  
标签:use trait 使用 Trait PHP 方法 public

一、 trait、继承、实例化三者的区别

对于当前一个类需要用到另一个或多个类的方法的情况,我们一般会想到的方式有继承、直接实例化另外一个或多个类等等的方法,来对比一下这些方法和Trait类的区别:

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

二、 Trait类的优先级控制

  1. 当前使用类 > Trait类 > 继承的基类
  2. 当存在同名方法时,会根据优先级覆盖掉同名的类

三、 多个Trait类的冲突控制

在PHP中,如果当前类use了两个Trait类,同时两个trait类都存在一个同名的方法,此时如果没有明确解决冲突将会产生一个致命错误。对于这种情况,PHP官方给出了两个解决方案:

  1. insteadof关键字:通过该关键字指定方法名冲突时该使用哪个Trait类的方法,即:
    如果C类use了A、B两个Trait类,且A、B两个类都存在a、b方法,则在C类use A、B类时使用insteadof声明冲突的解决方法即可:
    // An highlighted block
    use A, B {
      B::a insteadof A; //a方法冲突时使用B类的a方法而不使用A类的a方法
      A::b insteadof B; //b方法冲突时使用A类的b方法而不使用B类的b方法
    }
    
  2. as关键字:通过as关键字将同名方法指定为一个别名,且仅作用于当前类中:
    use A, B {
      B::a as c; //声明B类的a方法为c,作用于该类
      A::b as d; //声明A类的b方法为d,作用于该类
    }
    

四、 举个栗子

class Base{
	  public function sayHello(){
	    echo "hello ";
	  }
}

trait SayWorld{
	  public function sayHello(){
	    parent::sayHello();
	    echo "world".PHP_EOL;
	  }
}

trait SayWorld2{
	  public function sayHello2(){
	    echo "PHP".PHP_EOL;
	  }
}

class MyHelloWorld extends Base{
  	use SayWorld,SayWorld2;
}

$s = new MyHelloWorld();
$s->sayHello();
$s->sayHello2();

标签:use,trait,使用,Trait,PHP,方法,public
From: https://www.cnblogs.com/program01/p/17384452.html

相关文章

  • 使用 Sa-Token 完成踢人下线功能
    一、需求在企业级项目中,踢人下线是一个很常见的需求,如果要设计比较完善的话,至少需要以下功能点:可以根据用户userId踢出指定会话,对方再次访问系统会被提示:您已被踢下线,请重新登录。可以查询出一个账号共在几个设备端登录,并返回其对应的Token凭证,以便后续操作。可以只踢出......
  • Android Studio中使用断点调试程序
    1.设置断点在希望中断的位置左边label一下,设置一个断点。例如下方图片所示在ActivityResultRegistry类中的第147行设置了一个断点,以及在365行dispatchResult()方法处设置了一个断点。设置好断点后,可以在菜单栏依次点击Run->ViewBreakpoints查看所设置的全部的断点,并进行删减......
  • [PLC]三菱FX5U WORKS3中使用特殊继电器/特殊寄存器注释显示
    1.菜单栏"视图"-->"多个注释"-->"注释读取"2.勾选如图所示:3.点击确定,例如sm412这种特殊继电器/特殊寄存器就会自动显示注释.......
  • 【HarmonyOS】轻量级智能穿戴应用如何在页面中实现数据传递与全局变量的使用
    【关键词】轻量级智能穿戴、LiteWearable、数据传递、全局变量 【问题描述】开发轻量级智能穿戴LiteWearable应用,在app.js中定义全局变量,在页面中通过this.$app.$def.xxx获取时,报错TypeError:Cannotreadproperty'$def'ofundefined 【问题分析】经确认,LiteWearable......
  • 【configparser】Python解析配置文件的模块使用总结
    简介configparser是Pyhton标准库中用来解析配置文件的模块,并且内置方法和字典非常接近。Python2.x中名为ConfigParser,3.x已更名小写,并加入了一些新功能。调用importconfigparserconfig=configparser.ConfigParser()config.read("config.ini")常用方法#获取所用......
  • 使用LaTeX的bibitems引用时按照引用顺序对文献进行编号
    直接往tex文件中写入bibitem格式的参考文献难以满足按顺序引用文献的要求,参考https://zhuanlan.zhihu.com/p/468694034,可以使用GitHub的这个项目:https://github.com/LaTeX-Bibitem-Styler/latex-bibitemstyler首先将项目下载到本地,然后将latex项目中的main.tex分为两个文件,第一个......
  • httprunner 4.x学习 - 6.debugtalk辅助函数的使用
    前言httprunner4.x可以支持go语言和python语言写辅助函数,本篇主要介绍python语言写辅助函数。debugtalk辅助函数在项目根目录新建debugtalk.py文件写辅助函数可以实现自动化生成动态参数。如下生成时间戳和随机字符串示例#debugtalk.pyimporttimeimportuuidde......
  • 使用Openapi Generator生成TS相关代码
    OpenapiGenerator是SwaggerCodegen的分支,但功能更加强大1.安装JDK【略】2.下载jar包wgethttps://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6.5.0/openapi-generator-cli-6.5.0.jar-Oopenapi-generator-cli.jar或者Invoke-WebRequest-OutFileo......
  • oracle 行转列 使用PIVOT关键字
    select*from(SELECTSTOP_ID,POSITION,INSTANT,SET_VALUEfromtable1)pivot( min(INSTANT)I,min(SET_VALUE)VFORPOSITIONIN( 1ASHT1, 2ASHT2, 3ASHT3, 4ASHT4, 5ASHT5, 6AS HT1, 7AS HT2 ......
  • 使用 nodejs 从 0 实现简单易用的代理功能之 config.proxy
    从0实现config.proxyconfig.proxy类似于webpack的devServe中的代理,但更直观易用.本文为mockm的实现过程,编写此系列文章1是为了抛砖引玉,让想实现类似工具的朋友可以一起学习.2是也给自己做一个简单梳理.类型:string|object默认:http://www.httpbin.or......