浅谈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 相关文章推荐
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 PHP
19个超实用的PHP代码片段
Mar 14 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
PHP magento后台无法登录问题解决方法
Nov 24 PHP
php批量删除操作代码分享
Feb 26 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 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(6) 面向对象
2010/02/16 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
基于PHP制作验证码
2016/10/12 PHP
PHP levenshtein()函数用法讲解
2019/03/08 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
js实现购物车功能
2018/06/12 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
微信小程序wepy框架笔记小结
2018/08/08 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
幼儿园教师工作感言
2014/02/15 职场文书
白银帝国观后感
2015/06/17 职场文书