简单谈谈PHP中的trait


Posted in PHP onFebruary 25, 2017

前言

之前的一个同事换工作,在面试被问到了 PHP 的 trait 。因为没用过, 所以没答好,我大概是用过几次的,想了想整理了以下的总结。

trait

trait 是在一些类(Class)的应该具备的特定的属性或方法,而同父级的另外一些类应该避免包含这些属性和方法情况下使用的.

当然, 这也和开发者对类的抽象能力有关, 有些抽象能力好的, 可以减少对 trait 的使用 但是这种情况应该是无法避免的 不然 trait 出现就毫无意义了.

还有一种情况, 就是使用 trait 的时候, 可以起到的约束开发者的作用, 提醒开发者注意需要在开发的过程中调用 trait 的某些属性和方法.

同事则提出了一个好问题, 接口(interface) 不也是这个作用么?

不急, 让我们先看个例子:

比如你要收集网站上各类数据, 开发了 Spider 类. Spider 有个方法叫 request() 负责请求.

<?php namespace XWSoul\Network;
class Spider
{
 public function request($url)
 {
 //do sth.
 }
}

但是采集数据的过程中, 有些网站对蜘蛛敏感有些则不. 对于敏感的网站, 我们给出了一个使用代理的解决方案. 但是使用代理是会影响抓取速度的. 这就产生了 Spider 的子类有些需要用代理, 而能不用代理则尽量不用的情况.

于是这个时候我们新增了一个 trait Proxy:

<?php namespace XWSoul\Network;
trait Proxy
{

 protected $isProxy = false;

 public function useProxy($proxy)
 {
 //do sth proxy setups.
 $this->isProxy = true;
 return $this;
 }

 public function request($url)
 {
 if (!$this->isProxy) {
  throw new Exception("Please using proxy.");
 }
 //do sth.
 return parent::request($url);
 }
}

trait 重写了 Spider 的 request() 方法, 限定了在没有调用代理的情况下调用会抛出异常.

回到之前的问题, trait 这样的用法和 接口(interface) 有什么区别?

接口的约束是前置的是定义初始就必须实现的, 他可以约束方法的实现却无法约束方法的调用, trait 是一种后置的调用, 他已经实现了方法, 关键的是, 他只对调用了自身的类产生约束(废话一句), 而对没有调用自身的类不产生影响(再一句废话), 同时他是可复用的, 而且没有破坏 Spider 类自身的实现增加, Spider 还是那个 Spider.

我想 trait 的用法再这里已经很有效了吧.

后话

有人可能决定 另外实现一个 request 比如叫, proxyRequst 不就完了么? 你说的好有道理…然是如果我使用了不一样的 代理具体对请求上有细节差异怎么办呢? 在代码里不停的 if if if 么? trait 如此清爽的方案 为何要放弃呢?

总结

好了,以上就是这篇文章的全部内容了希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php中调用其他系统http接口的方法说明
Feb 28 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 PHP
laravel中命名路由的使用方法
Feb 24 #PHP
cakephp常见知识点汇总
Feb 24 #PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 #PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 #PHP
CakePHP框架Session设置方法分析
Feb 23 #PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 #PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 #PHP
You might like
配置最新的PHP加MYSQL服务器
2006/10/09 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
2017/09/28 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python获取脚本所在目录的正确方法
2014/04/15 Python
python新手经常遇到的17个错误分析
2014/07/30 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
PyQt5实现下载进度条效果
2018/04/19 Python
python skimage 连通性区域检测方法
2018/06/21 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
如何为Python终端提供持久性历史记录
2019/09/03 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
十佳党员事迹材料
2014/08/28 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript