浅谈PHP中的Trait使用方法


Posted in PHP onMarch 22, 2019

概述

在PHP中有一种代码复用的技术, 因为单继承的问题, 有些公共方法无法在父类中写出, 而 Trait可以应对这种情况, 它可以定义一些复用的方法, 然后在你需要使用的类中将其引入即可.

刚开始的时候给我的感觉就是将trait代码块直接拿到类中的意思, 但后来我发现, 我太天真了.

PHP中的Trait用法:

浅谈PHP中的Trait使用方法

问题

当我第一次使用的时候, 因为之前一直使用抽象类, 或者定义内部对象, 然后调用内部对象中的方法, 所以我当时有了以下几个问题:

1.能否引入多个, 如果可以的话, 同名方法如何处理

2.引入方法与现有方法重名时, 如何解决

3.能否定义抽象方法, 因为有些方法需要知道使用时的情况, 在抽象类中, 这种情况一般通过调用抽象方法来解决

4.能否定义字段

5.能否将字段或方法定义为静态

6.能否对方法进行权限控制

答疑

1. Trait 可以引入多个, 多个trait中存在同名方法时, 需要指定使用哪个方法, 如下:

浅谈PHP中的Trait使用方法

2.引入方法与现有方法重名时, 会优先调用类中已定义的方法, 其优先级顺序为: 当前类方法>trait方法>父类方法

3. trait 中可以定义抽象方法, 语法与抽象类相同

浅谈PHP中的Trait使用方法

4.trait 中可以定义字段, 语法与类相同

浅谈PHP中的Trait使用方法

5. 可以定义静态方法与静态字段

浅谈PHP中的Trait使用方法

6. 可以进行方法权限的控制

浅谈PHP中的Trait使用方法

7. 另外, 在trait 代码块中还可以引入其他trait代码块, 语法与类中引入相同:

浅谈PHP中的Trait使用方法

总结

至此, 我发现了一个新的问题, 这个 trait 与抽象类有什么区别? 说什么代码复用, 这不就是多继承么? trait与抽象类功能上有区别么? 抽象类能干的, trait都能干啊.

思前想后, 我觉得区别还是有的, 虽然说他们两个看着很像, 功能相似, 但是正如抽象类与接口一样(虽然这两者不同, 接口不能定义方法), 接口更侧重于定义一组公共的方法, 一种规范, 而抽象类则侧重于将子类中公共的方法进行抽离, 提高代码的复用.

trait 与抽象类的侧重点也不相同

trait 侧重于定义共用的代码片段, 它并不管引用此片段的类是干什么的, 只要你需要, 就可以拿走去用, 简单说就是 trait 并不约束类的类型, 而仅仅定义方法

抽象类则不同, 既然你继承我, 那你干的事情肯定跟我是一样的, 不能抽象类是去与数据库交互的, 你子类去写脚本了. 所以抽象类相对 trait 更侧重于 类型的约束.

以上所述是小编给大家介绍的PHP中的Trait使用方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
编写自己的php扩展函数
Oct 09 PHP
社区(php&&mysql)二
Oct 09 PHP
PHPMailer 中文使用说明小结
Jan 22 PHP
php ss7.5的数据调用 (笔记)
Mar 08 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
使用PHP如何实现高效安全的ftp服务器(二)
Dec 30 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
PHP树-不需要递归的实现方法
Jun 21 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
PHP观察者模式定义与用法实例分析
Mar 22 #PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 #PHP
PHP中$GLOBALS与global的区别详解
Mar 21 #PHP
PHP压缩图片功能的介绍
Mar 21 #PHP
PHP应用跨时区功能的实现方法
Mar 21 #PHP
PHP时间函数使用详解
Mar 21 #PHP
PHP抽象类与接口的区别详解
Mar 21 #PHP
You might like
用PHP将数据导入到Foxmail
2006/10/09 PHP
PHP面向对象法则
2012/02/23 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
讲解Python中的递归函数
2015/04/27 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
Python单元测试与测试用例简析
2019/11/09 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
前台文员岗位职责及工作流程
2013/11/19 职场文书
入团者的自我评价分享
2013/12/02 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
村安全生产责任书
2014/08/25 职场文书
幼师小班个人总结
2015/02/12 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL