Home > Backend Development > PHP Tutorial > php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?

php中,用函数,如果有很多个参数,只使用最后一个参数,有什么优雅的写法?

WBOY
Release: 2016-06-06 20:50:24
Original
1210 people have browsed it

比如有一个function()

<code class="lang-php">function find($conditions = null, $sort = null,..(很多参数).., $fields = null, $limit = null)
</code>
Copy after login
Copy after login

现在我只要使用第一个和最后一个参数,一般都是 find('xxx','','','',...,'xxx') 很不好看,有没有什么优雅一点的写法呢?

回复内容:

比如有一个function()

<code class="lang-php">function find($conditions = null, $sort = null,..(很多参数).., $fields = null, $limit = null)
</code>
Copy after login
Copy after login

现在我只要使用第一个和最后一个参数,一般都是 find('xxx','','','',...,'xxx') 很不好看,有没有什么优雅一点的写法呢?

分两种情况讨论这个问题。

  1. 如果你是想固定其中某几个值
  2. 如果你是想让其中某些参数有默认值

情况一:如果你是想提前固定其中某几个参数的值

你可以对函数进行部分求值(柯里化),得到一个新的函数,后续使用的时候,使用新函数去操作。

而在柯里化的时候,可以自定义其中某些参数的值。

例如

<code>// 原始的函数
function find($conditions = null, $sort = null,..(很多参数).., $fields = null, $limit = null)

// 柯里化后的函数
function curryFind($conditions, $limit) {
    return find($conditions, "sort", ..., "fields", $limit);
}
</code>
Copy after login

情况二:如果你是想让其中某些参数有默认值

可以讲可选参数合并为一个数组。参数以数组形式传入,与默认参数数组进行合并。

例如

<code>function find($options) {
    $defaultOptions = array(
        'conditions' => 'c',
        'sort' => 's',
        ...
        'fields' => 'f',
        'limit' => 'l'
    );
    $options = array_merge($defaultOptions, $options);

    // do something.
}
</code>
Copy after login

这两种情况并没有很明显的区别,只是处理多个参数的方法而已。根据你自己的需求来使用。

参考资料

  1. http://stackoverflow.com/questions/1609985/is-it-possible-to-curry-method-calls-in-php
  2. 柯里化:http://en.wikipedia.org/wiki/Currying

如果一个函数一堆参数,本身就说明这个函数的设计有问题,尽早考虑重构吧。

如果实在没办法,可以考虑使用 call_user_func_array() 函数,构造一个数组传进去就可以了。

带一个 array 进去 ...

<code>function find( array(
    'conditions'    =>  '1',
    'sort'          =>  '2',
    // .... 
    'limit'         =>  '3'
    ) );
</code>
Copy after login

没有就不写 ...

你把这个方法的最后一个参数拿到第二个参数的地方不就可以了。

<code>function find($conditions = null, $limit = null,$sort = null,..(很多参数).., $fields = null)
</code>
Copy after login

<code class="lang-php">function abc($str) {
    parse_str($str,$arr);
    $arr['key'];
}

$some = abc('key=1&p=2&some......');
</code>
Copy after login

// 使用 非固定函数 static function fun(){ $numargs = funcnumargs();//获取参数个数; $arglist = funcget_args();//获取参数列表 } //函数自己设计吧,s设计一个函数 把它带入到老函数就好

funcgetargs 和 funcgetnums 函数

怎么下划线没了?

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template