PHP多参数方法的重构(代码示例)

阅读量:25
2021-04-18

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

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

以上就是PHP多参数方法的重构(代码示例)的详细内容,更多请关注星网无限其它相关文章!

声明:本文转载于:歪麦,如有侵犯,请联系admin@删除

THE END

发表评论

相关推荐

  • 有关fgets()函数的文章推荐10篇

    以下正文:这篇文章主要介绍了PHP文件读写操作相关函数总结,本文总结了fwrite()、fread()、fgets()、fgetc()、file()、readf ...

    阅读量:67
    2021-04-19
  • php递归与无限分类实例详解

    这篇文章主要介绍了php实现递归与无限分类的方法,涉及php的递归操作技巧,需要的朋友可以参考下本文实例讲述了php实现递归与 ...

    阅读量:46
    2021-04-19
  • CI框架中zip类的使用

    CI框架自带的zip类简单实用,本文就来简单说一下ci框架的zip类的使用,需要的朋友可以参考下CI框架自带的zip类简单实用,本文 ...

    阅读量:45
    2021-04-18
  • SWFUpload插件上传文件的代码

    这篇文章主要介绍了文件上传之SWFUpload插件(代码),实现此代码主要分为两部分:1.前台文件和 2.后台文件upload.php,需要 ...

    阅读量:43
    2021-04-18
  • 关于destoon的URL Rewrite设置方法

    这篇文章主要介绍了destoon的URL Rewrite(伪静态)设置方法,需要的朋友可以参考下1、如果您的服务器支持.htaccess,则无需设 ...

    阅读量:48
    2021-04-18