如何跳过函数调用中的可选参数?

好吧,我完全忘了如何跳过PHP中的参数。

可以说我有:

function getData($name, $limit = '50', $page = '1') { ... } 

我如何调用这个函数,使中间参数取默认值(即'50')?

 getData('some name', '', '23'); 

以上是否正确? 我似乎无法得到这个工作。

您的post是正确的。

不幸的是,如果您需要在参数列表的最后使用可选参数,则必须指定所有内容直到最后一个参数。 一般情况下,如果你想混合和匹配,你给他们默认值为''null ,并且不要在函数内部使用它们,如果它们是默认值。

没有办法“跳过”一个参数,而不是指定一个像falsenull这样的默认null

由于PHP在这方面缺less一些语法糖,因此您经常会看到类似这样的内容:

 checkbox_field(array( 'name' => 'some name', .... )); 

正如在评论中雄辩地说的那样,它使用数组来模拟命名参数。

这提供了最大的灵活性,但在某些情况下可能不需要。 至less你可以把你认为不是大部分时间的东西移动到参数列表的末尾。

不,不可能这样跳过争论。 只有在参数列表的末尾,您才能省略传递参数。

有一个正式的提议: https : //wiki.php.net/rfc/skipparams ,被拒绝了。 提案页面链接到其他关于此主题的SO问题。

没有什么改变可以跳过可选参数,但是为了正确的语法,并且能够为我想跳过的参数指定NULL,下面是我该怎么做:

 define('DEFAULT_DATA_LIMIT', '50'); define('DEFAULT_DATA_PAGE', '1'); /** * getData * get a page of data * * Parameters: * name - (required) the name of data to obtain * limit - (optional) send NULL to get the default limit: 50 * page - (optional) send NULL to get the default page: 1 * Returns: * a page of data as an array */ function getData($name, $limit = NULL, $page = NULL) { $limit = ($limit==NULL) ? DEFAULT_DATA_LIMIT : $limit; $page = ($page==NULL) ? DEFAULT_DATA_PAGE : $page; ... } 

这可以这样调用: getData('some name',NULL,'23'); 任何在将来调用这个函数的人都不需要记住每次的默认值或者为它们声明的常量。

简单的答案是没有 。 但为什么跳过重新安排的论点达到这一点呢?

你的是一个“ 默认函数参数的错误用法 ”,并不会像你期望的那样工作。

PHP文档的一个附注:

当使用默认参数时,任何默认值都应该在任何非默认参数的右边; 否则,事情将无法按预期工作。

考虑以下:

 function getData($name, $limit = '50', $page = '1') { return "Select * FROM books WHERE name = $name AND page = $page limit $limit"; } echo getData('some name', '', '23'); // won't work as expected 

输出将是:

 "Select * FROM books WHERE name = some name AND page = 23 limit" 

正确使用默认函数参数应该是这样的:

 function getData($name, $page = '1', $limit = '50') { return "Select * FROM books WHERE name = $name AND page = $page limit $limit"; } echo getData('some name', '23'); // works as expected 

输出将是:

 "Select * FROM books WHERE name = some name AND page = 23 limit 50" 

在非默认值之后放置默认值,确保它将总是重新调用该variables的默认值,如果它没有被定义/给出这里是一个供参考的链接以及这些例子来自哪里。

编辑:设置为null作为其他人暗示可能工作,是另一种select,但可能不符合你想要的。 如果未定义,它将始终将默认值设置为null。

如上所述,您将无法跳过参数。 我已经写了这个答案来提供一些附录,这个附录太大而不能发表评论。

@Frank Nocke build议使用其默认参数调用该函数,例如具有

 function a($b=0, $c=NULL, $d=''){ //... 

你应该使用

 $var = a(0, NULL, 'ddd'); 

这在function上与省略前两个( $b$c )参数相同。

目前尚不清楚哪些是默认值(是否提供默认值,或者是否重要?)。

当函数(或方法)作者可以更改默认值时,还有一个缺陷值问题连接到外部(或内置)函数的危险。 所以如果你不能在程序中改变你的呼叫,你可能会无意中改变它的行为。

一些解决方法可能是定义一些全局常量,如DEFAULT_A_B这将是“函数A的B参数的默认值”和“省略”参数:

 $var = a(DEFAULT_A_B, DEFAULT_A_C, 'ddd'); 

对于类来说,如果你定义了类常量,它会更简单,更优雅,因为它们是全局作用域的一部分,例如。

 class MyObjectClass { const DEFAULT_A_B = 0; function a($b = self::DEFAULT_A_B){ // method body } } $obj = new MyObjectClass(); $var = $obj->a(MyObjectClass::DEFAULT_A_B); //etc. 

请注意,这个默认常量在整个代码中都被定义了一次(即使在方法声明中也没有值),所以如果出现一些意想不到的变化,您将始终为函数/方法提供正确的默认值。

这个解决scheme的清晰度当然比提供原始的默认值(如NULL0等)更好,这对读者来说没有任何意义。

(我同意调用像$var = a(,,'ddd');将是最好的select)

对于任何跳过的参数(你必须)使用默认参数,以保证安全。

(如果默认参数是“”或类似的,则返回null,反之则会让你陷入困境……)

你不能跳过参数,但是你可以使用数组参数,你只需要定义一个参数,这是一个参数数组。

 function myfunction($array_param) { echo $array_param['name']; echo $array_param['age']; ............. } 

你可以添加你所需要的参数,你不需要定义它们。 当你调用这个函数的时候,你把你的参数设置成这样:

 myfunction(array("name" => "Bob","age" => "18", .........)); 

就像其他人已经说过的那样,如果不在函数中添加任何代码行,那么在PHP中无法实现。

但是你可以把这段代码放在函数的顶部来获得你的function:

 foreach((new ReflectionFunction(debug_backtrace()[0]["function"]))->getParameters() as $param) { if(empty(${$param->getName()}) && $param->isOptional()) ${$param->getName()} = $param->getDefaultValue(); } 

所以基本上与debug_backtrace()我得到这个代码被放置的函数名称,然后创build一个新的ReflectionFunction对象,并通过所有函数参数循环。

在循环中,我只是检查函数参数是否为empty() AND参数是“可选”(意味着它有一个默认值)。 如果是的话,我只是简单地分配默认值的参数。

演示

将限制设置为null

 function getData($name, $limit = null, $page = '1') { ... } 

并调用该函数

 getData('some name', null, '23'); 

如果你想设置限制,你可以作为parameter passing

 getData('some name', 50, '23'); 

如前所述 ,没有任何改变。 但要小心,太多的参数(特别是可选的参数)是代码异味的强烈指标。

也许你的function太多了:

 // first build context $dataFetcher->setPage(1); // $dataFetcher->setPageSize(50); // not used here // then do the job $dataFetcher->getData('some name'); 

一些参数可以按逻辑分组:

 $pagination = new Pagination(1 /*, 50*/); getData('some name', $pagination); // Java coders will probably be familiar with this form: getData('some name', new Pagination(1)); 

最后,你可以随时引入一个ad-hoc 参数对象 :

 $param = new GetDataParameter(); $param->setPage(1); // $param->setPageSize(50); // not used here getData($param); 

(这只是不太正式的参数数组技术的荣耀版本)

有时,使参数可选的原因是错误的。 在这个例子中, $page真的是可选的? 保存几个字符是否真的有所作为?

 // dubious // it is not obvious at first sight that a parameterless call to "getData()" // returns only one page of data function getData($page = 1); // this makes more sense function log($message, $timestamp = null /* current time by default */); 

这段代码:


    函数getData($ name,$ options){
        $ default = array(
             'limit'=> 50,
             'page'=> 2,
         );
         $ args = array_merge($ default,$ options);
        的print_r($参数);
     }

     getData('foo',array());
     getData('foo',array('limit'=> 2));
     getData('foo',array('limit'=> 10,'page'=> 10));

答案是:


     排列
     (
         [限制] => 50
         [page] => 2
     )
    排列
     (
         [限制] => 2
         [page] => 2
     )
    排列
     (
         [限制] => 10
         [page] => 10
     )

这是我会做的:

 <?php function getData($name, $limit = '', $page = '1') { $limit = (EMPTY($limit)) ? 50 : $limit; $output = "name=$name&limit=$limit&page=$page"; return $output; } echo getData('table'); /* output name=table&limit=50&page=1 */ echo getData('table',20); /* name=table&limit=20&page=1 */ echo getData('table','',5); /* output name=table&limit=50&page=5 */ function getData2($name, $limit = NULL, $page = '1') { $limit = (ISSET($limit)) ? $limit : 50; $output = "name=$name&limit=$limit&page=$page"; return $output; } echo getData2('table'); // /* output name=table&limit=50&page=1 */ echo getData2('table',20); /* output name=table&limit=20&page=1 */ echo getData2('table',NULL,3); /* output name=table&limit=50&page=3 */ ?> 

希望这会帮助别人

尝试这个。

 function getData($name, $limit = NULL, $page = '1') { if (!$limit){ $limit = 50; } } getData('some name', '', '23'); 

在你的函数调用中你不能跳过中间参数。 但是,你可以解决这个问题:

 function_call('1', '2', '3'); // Pass with parameter. function_call('1', null, '3'); // Pass without parameter. 

function:

 function function_call($a, $b='50', $c){ if(isset($b)){ echo $b; } else{ echo '50'; } } 

正如@IbrahimLawal指出的那样。 最好的做法是将它们设置为null值。 只需检查传递的值是否为null ,即使用您定义的默认值。

 <?php define('DEFAULT_LIMIT', 50); define('DEFAULT_PAGE', 1); function getData($name, $limit = null, $page = null) { $limit = is_null($limit) ? DEFAULT_LIMIT : $limit; $page = is_null($page) ? DEFAULT_PAGE : $page; ... } ?> 

希望这可以帮助。

 getData('some name'); 

只是不通过它们,默认值将被接受