浅谈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 Memcached应用实现代码
Feb 08 PHP
discuz的php防止sql注入函数
Jan 17 PHP
php学习之变量的使用
May 29 PHP
基于Zend的Config机制的应用分析
May 02 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
php二维数组排序方法(array_multisort usort)
Dec 25 PHP
php排序算法实例分析
Oct 17 PHP
Yii2中多表关联查询hasOne hasMany的方法
Feb 15 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
Selenium执行JavaScript脚本的方法示例
2020/12/31 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
基于python实现百度翻译功能
2019/05/09 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
中专毕业生自我鉴定
2013/11/21 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
鸡毛信观后感
2015/06/11 职场文书
生日宴会祝酒词
2015/08/10 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers