php中文网最新课程

每日17点准时技术干货分享

假设我们要完成一个保存文章的功能,如果采用函数编程的方式,大概会是下面这个样子:

<?php function saveArticle($title, $content, $categoryId){    // ...}?>

每个参数代表一个属性,但带来一个问题,参数列表会变得很长。此时采用对象编程的技术会是个好方法:

<?php class Article{    var $title;    var $content;    var $categoryId;    function save(){        // ...    }}?>

在这里,原来的方法参数都转换为以对象的属性方式存在,从而大大降低了方法的参数数量。多数时候这个方法是不错的,不过并不是所有的参数都适合以对象属性的方式存在,区分的原则是,看这些参数是属于对象的内在属性还是外在特征,如果不加区分的统统转换为对象属性,这会让对象本身失去意义。

举个例子,比如说我们的Article对象还有一个名为find的方法,使用它时可能会涉及limit, offset, order等参数:

<?php class Article{    var $title;    var $content;    var $categoryId;    var $limit = 10;    var $offset = 0;    var $order = 'created DESC';    function save(){        // ...    }    function find($categoryId){        // ...    }}?>

如上所示,一旦我们把limit,offset,order等参数转换为对象的属性,这个对象本身就变得不伦不类了,因为虽然title,content,categoryId可以算作是对象的内在属性,而limit,offset,order却不是,顶多也只能算作是外部特征,不加区分的结果基本是噩梦的开始。所以,还是老老实实的把外在特征放到方法的参数里好些(更严格的说,find方法应该是一个static类型的方法,不过文本就是一个简单的说明,不必细究):

<?php class Article{    var $title;    var $content;    var $categoryId;    function save(){        // ...    }    function find($categoryId, $limit = 10, $offset = 0, $order = 'created DESC'){        // ...    }}?>可惜如此一来又出现了文章开头所说的问题,find方法的参数太多了,缺乏可读性,所以还得重构:<?php class Article{    var $title;    var $content;    var $categoryId;    function save(){        // ...    }    function find($categoryId, $options = array()){        $default = array(            'limit' => 10,            'offset' => 0,            'order' => 'created DESC'        );        $options = array_merge($default, (array)$options);         // ...    }}?>

看上去还不错,调用时可以使用类似下面的方法:

$article->find(123, array('limit' => 20));

简单的说,就是用数组方式的参数,来模拟一种类似关键字参数的效果,采用这种方式的话,可以通过数组的键名来描述参数的作用,从而增加代码的可读性。

类似这样的重构方法在CakePHP等项目里被大量使用,仔细体会,以后再写代码的时候就可以本能的写出高可读性的代码来。

补充:相对array_merge来说,使用$options += $default;也是不错的选择。另外,如果options的逻辑很复杂的话,也可以不用数组的方式,转而使用一个专门的对象来封装逻辑操作。

-END-

声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!

参数php_PHP多参数方法的重构相关推荐

  1. java.函数参数太多,Java方法参数太多怎么办—Part 2—引入参数对象,javapart

    Java方法参数太多怎么办-Part 2-引入参数对象,javapart 目录 自定义类型 引入参数对象 本文是这个系列的第二篇文章,介绍了通过引入参数对象应对参数过多的问题.如果你也希望参与类似的系 ...

  2. 一种解决启动进程传递参数过长的方法

    工作中,QA同学在测试我们程序的时候,发现在XP下,我们的A进程无法启动我们的B进程.而在Win7 64bit系统下功能正常.RD同学调试后,发现我们A进程中使用ShellExcute去启动了B进程( ...

  3. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  4. 微软Print to PDF打印机提示参数错误的解决方法

    微软Print to PDF打印机提示参数错误的解决方法 参考文章: (1)微软Print to PDF打印机提示参数错误的解决方法 (2)https://www.cnblogs.com/conduc ...

  5. 在AngularJS中读取查询参数的最简洁方法是什么?

    本文翻译自:What's the most concise way to read query parameters in AngularJS? I'd like to read the values ...

  6. mac地址修改_优酷路由宝救砖时MAC和无线参数及SN恢复方法

    科普:成砖和救砖 路由器刷机时如果中途断电或者其他特殊情况,可能导致路由器无法启动,也就是俗称成砖.这时候就需要用编程器直接对路由器闪存进行读写,重新刷入固件称为救砖. 一般的救砖办法是,用编程器写入 ...

  7. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  8. springboot获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...

  9. 解惑(三)----- 深入理解Python中的self参数和__init__(self)方法--通过类比Java语言

    一.前言 在这里我想通过用Python和Java语言的类比来对Python中的self参数和__init__(self)方法做一个深入的解释.这样可以加深对self参数和__init__(self)方 ...

最新文章

  1. ppt怎么加注解文字_ppt注释的使用方法
  2. 小公司如何提高效率?
  3. IIs+php 最精简的环境配置
  4. JAVA中文支持指南(Vera Yuanti)
  5. C语言 指针数组和数组指针区别 - C语言零基础入门教程
  6. c语言switch comiti,国际经济学作业复习资料第三章.docx
  7. 《OpenStack云计算实战手册(第2版)》——1.4 安装OpenStack身份认证服务
  8. pycharm windows 打开命令行终端terminal
  9. bing的翻译API 国际化
  10. Mac上WineSkin游戏无法正常运行
  11. 建筑施工技术【14】
  12. 开源demo| 你画我猜——让你的生活更有趣
  13. win7 简体中文 旗舰版 种子 永久激活 全在附件
  14. oracle卸数的perl脚本,卸载cpan安装的所有perl模块
  15. Linux上采用rdtsc指令对C/C++程序进行性能测试
  16. ios设备管理软件imazing 2.16.2官网下载,2022年强悍来袭!
  17. 软件项目管理复习要点
  18. 无人机实验平台(七) 实验平台的坐标转换(上)
  19. delphi 安装tee8.01图表插件
  20. 11、Java——吃货联盟订餐系统(对象+数组)

热门文章

  1. pat 乙级 1014 福尔摩斯的约会 (C++)
  2. 怎样选择合适的PoE交换机?POE交换机选用小常识!
  3. 【渝粤教育】国家开放大学2018年春季 0025-21T数据结构 参考试题
  4. [渝粤教育] 中国地质大学 计算机图形学(新) 复习题
  5. [渝粤教育] 中国地质大学 数据结构 复习题 (2)
  6. 【渝粤题库】陕西师范大学210023 学前儿童社会教育 作业(专升本)
  7. lora无线模块基于LoRaWAN网关技术在国家物联网应用
  8. 怎么配置在谷歌和ie内核时使用不同的_重磅!微软竟然研发了谷歌内核的edge
  9. 【总结】C语言实用算法系列之知识点梳理_附学生管理系统各模块代码
  10. cpta 好像有漏洞