浅谈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 CKEditor 上传图片实现代码
Nov 06 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
PHP 实现浏览记录并按日期分组
May 11 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Jan 22 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编程中尝试程序并发的几种方式总结
2016/03/21 PHP
PHP7下协程的实现方法详解
2017/12/17 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
绑定回车enter事件代码
2014/05/18 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
跟老齐学Python之编写类之三子类
2014/10/11 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
python Web开发你要理解的WSGI & uwsgi详解
2018/08/01 Python
python tkinter基本属性详解
2019/09/16 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
大学生自荐书范文
2013/12/10 职场文书
大二自我鉴定
2014/01/31 职场文书
高三英语复习计划
2015/01/19 职场文书
小升初自荐信范文
2015/03/05 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
2015年采购员工作总结
2015/04/27 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
解析Java异步之call future
2021/06/14 Java/Android
MySQL读取JSON转换的方式
2022/03/18 MySQL
MySQL GTID复制的具体使用
2022/05/20 MySQL