浅谈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边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
PHP简单系统查询模块代码打包下载
Jun 07 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
php模板函数 正则实现代码
Oct 15 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
分享五个PHP7性能优化提升技巧
Dec 07 PHP
Symfony2之session与cookie用法小结
Mar 18 PHP
php使用正则验证中文
Apr 06 PHP
微信公众平台DEMO(PHP)
May 04 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
CI框架入门之MVC简单示例
Nov 21 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程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
PHP实现文件上传与下载
2020/08/28 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
js 数值项目的格式化函数代码
2010/05/14 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
JS简单实现无缝滚动效果实例
2016/08/24 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
js实现简单进度条效果
2020/03/25 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
python中cPickle用法例子分享
2014/01/03 Python
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
使用python接入微信聊天机器人
2020/03/31 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
大学毕业生通用自我评价
2014/01/05 职场文书
秋季运动会活动方案
2014/02/05 职场文书
家长评语和期望
2014/02/10 职场文书
班主任班级寄语大全
2014/04/04 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
委托书范本格式
2019/04/18 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
python数据处理之Pandas类型转换
2022/04/28 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript
Redis keys命令的具体使用
2022/06/05 Redis