`
huanlong78
  • 浏览: 34104 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

PHP 多参数方法的重构

    博客分类:
  • PHP
阅读更多

起:在百度上看到了 老王 的一篇函数重构的文章 很好~ 但是没看懂,留下自己以后慢慢看.

 

----------------------------------

作者:老王

地址:http://hi.baidu.com/thinkinginlamp/blog/item/f4bd08fa41c9f19e58ee902b.html

 

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

 

<?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的逻辑很复杂的话,也可以不用数组的方式,转而使用一个专门的对象来封装逻辑操作

 

-----------------------------------------------

贴上此函数的说明(出自 PHP5手册):

 

array_merge() :

 

说明

array array_merge ( array array1, array array2 [, array ...])

array_merge() 将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。

如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

例子 1. array_merge() 例子

<?php
$array1
= array ("color" => "red", 2, 4);
$array2 = array ("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge ($array1, $array2);
print_r($result);
?>

$result 成为:

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)
分享到:
评论

相关推荐

    PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

    在日常开发中,关注重构原则,合理地安排重构的时机,以及采用恰当的重构方法,都是提高代码质量、降低维护成本的重要手段。同时,良好的编码习惯和对专业术语的掌握,也是提升个人技术水平和团队协作效率的关键因素...

    Atom-atom-refactoring,为php源代码提供重构功能的atom包。.zip

    5. **参数重组**:调整函数或方法的参数顺序,同时更新所有调用点,确保调用语法正确。 6. **提取接口**:从现有类中抽取接口,以便更好地实现面向接口编程。 7. **引入字段**:当局部变量在多个地方被使用时,...

    PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    首先,`Rename Method` 是一个基础但至关重要的重构方法。当函数的名称无法清晰地反映其功能时,应当修改为更具描述性的名称。一个好的函数名应当能够自解释,就像一句简短的注释,帮助读者快速理解函数的作用。在...

    重构_改善既有代码的设计

    书中提出了70多个具体的重构方法,每个方法都详细阐述了其背后的原因、做法以及在何种情况下适用。例如,重构可能会涉及改变一个类的继承结构、方法的参数列表或者将类的职责进行重新分配。每个重构步骤都应遵循几个...

    intellij-idea php插件

    - **智能提示**:根据上下文提供智能提示,如函数参数、类方法等。 2. **框架支持**: - **Laravel**:集成Laravel框架的支持,包括路由导航、模型提示、视图文件关联等。 - **Symfony**:提供Symfony框架的代码...

    php7新特性

    类似于返回类型声明,PHP7还可以对函数的参数类型进行声明,要求传入的参数必须是整数、浮点数、字符串或布尔值等标量类型。 10. Exceptions in Engine(引擎中的异常) PHP7允许直接在引擎内部抛出异常,而不仅...

    50个提高PHP编程效率的方法.rar

    在PHP编程中,提高效率是每个...以上50个方法覆盖了PHP开发的多个方面,从代码编写到系统架构,全方位提升PHP编程效率。每个开发者都应该根据自己的项目特点,灵活运用这些方法,打造高质量、高性能的PHP应用程序。

    refactoring_book:Martin Fowler重构书中的示例,转录为PHP

    5. **引入参数对象(Introduce Parameter Object)**:如果一个函数接收多个参数,且这些参数之间存在关联,可以创建一个新的对象来封装这些参数,使得调用更加简洁明了。 6. **移动字段(Move Field)**:当一个...

    PHP从入门到精通视频教程讲解

    - **会话管理**:session的工作原理及使用方法,如何在多个页面间共享数据。 - **模板引擎**:介绍几种常用的PHP模板引擎(如Smarty、Twig等),提高代码的可维护性。 - **RESTful API设计**:学习如何使用PHP构建...

    PHP5 Power Programming

    6. **性能优化**:提供PHP5应用程序性能优化的方法,如缓存机制、代码重构、服务器配置等。 7. **框架与工具**:介绍常用的PHP5框架和开发工具,如Symfony、Zend Framework等。 8. **实践案例**:通过实际项目示例...

    支付宝支付去除lotusphp框架

    支付宝支付在许多网站和应用程序中被广泛采用,其便捷性和安全性深受...它涉及到接口理解、代码重构、错误处理、安全性强化、性能优化等多个方面,对于有经验的开发者来说,这是一个提升系统性能和可维护性的宝贵机会。

    php-7.0.33.tar.gz

    在PHP 7中,Zend Engine进行了重构,优化了内存管理,减少了内存占用,并提高了执行效率。此外,PHP 7还移除了旧版的“ZEND_EVAL”操作码,用“OPcache”替代,实现了预编译,进一步提升了运行速度。 在类型系统...

    PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    #### 对象间搬移特性的具体重构方法 ##### Move Method(搬移函数) 当一个类中的方法与其他类有太多交集时,可以在另一个类中创建一个功能相似的新函数,然后将原函数转换为纯代理函数(Delegating Method),...

    php 代码转换

    总结来说,PHP代码转换是一个涵盖版本升级、代码风格统一、函数替换、OOP重构以及性能优化等多个方面的过程。这不仅有助于保持代码的最新状态,还能提高代码质量,降低维护成本。在进行代码转换时,应充分理解新特性...

    linux 下php5.6源码

    尽管PHP7已经推出并有多个后续版本,但PHP5.6仍然在很多项目中被广泛使用,因为它的稳定性和对旧版软件的良好支持。 PHP5.6引入了许多改进和新特性,包括: 1. **性能提升**:PHP5.6相对于前一版本进行了性能优化...

    40条优化php代码的小实例.

    31. **mysqli**:在PHP5和MySQL4.1以上版本中,使用mysqli扩展代替mysql_,以利用更多的优化功能。 32. **三元运算符**:三元运算符(? :)提供了一种简洁的条件判断方式。 33. **PEAR库**:在重构项目前,考虑...

    PHP实例开发源码—OKList php网址聚合程序.zip

    【PHP实例开发源码—OKList php网址聚合程序】 PHP是一种广泛使用的开源脚本语言,尤其在Web开发领域,PHP的应用极为广泛。...通过深入理解和重构这个程序,开发者能进一步提升自己的PHP技能和Web开发能力。

    PHP实例开发源码—网站综合查询 PHP 系统修正版.zip

    - 这样的系统通常包含多个查询接口,允许用户根据不同的参数(如关键词、日期范围、分类等)查找信息。 - 查询系统可能使用了SQL查询语句来从数据库中检索数据,通过PHP进行处理并返回给用户。 - 修正版可能意味...

Global site tag (gtag.js) - Google Analytics