浅谈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源码之 ext/mysql扩展部分
Jul 17 PHP
PHP性能优化 产生高度优化代码
Jul 22 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP7标量类型declare用法实例分析
Sep 26 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
利用ajax和PHP实现简单的流程管理
Mar 23 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 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访问Google Search API的方法
2015/03/05 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP简单遍历对象示例
2016/09/28 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
js 分页全选或反选标识实现代码
2011/08/09 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
给Python入门者的一些编程建议
2015/06/15 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
实例详解Python模块decimal
2019/06/26 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Django通过json格式收集主机信息
2020/05/29 Python
python批量修改文件名的示例
2020/09/27 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
软件售后服务方案
2014/05/29 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
主持人开幕词
2015/01/29 职场文书
美容院管理规章制度
2015/08/05 职场文书
您对思维方式了解多少?
2019/12/09 职场文书