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

85 php parameters function default-value optional-parameters

好的,我完全忘记了如何在PHP中跳过参数.

让我们说:

function getData($name, $limit = '50', $page = '1') {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我如何调用此函数以使middle参数采用默认值(即'50')?

getData('some name', '', '23');
Run Code Online (Sandbox Code Playgroud)

以上是否正确?我似乎无法让这个工作.

zom*_*bat 50

你的帖子是正确的.

不幸的是,如果您需要在参数列表的最后使用可选参数,则必须在最后一个参数之前指定所有内容.通常,如果要混合匹配,则为它们提供默认值''or null,如果它们是默认值,则不要在函数内部使用它们.

  • 有关此内容的 PHP 文档位于[此处](https://wiki.php.net/rfc/named_pa​​rams) 和[此处](/sf/ask/94003591/ -so-that-Optional-arguments-can-be-omit-from-f#answer-64997399) 已经是 Stackoverflow 上的答案。 (3认同)
  • @iamme做$ limit = is_numeric($ limit)吗?$ limit:'50';`在* getData *函数的开头 (2认同)
  • 2022 年 PHP 8.x 的答案是错误的。 (2认同)

Pao*_*ino 38

有没有办法"跳过"之外的其他参数,而不是像指定一个默认falsenull.

由于PHP在这方面缺乏一些语法糖,你经常会看到这样的东西:

checkbox_field(array(
    'name' => 'some name',
    ....
));
Run Code Online (Sandbox Code Playgroud)

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

这提供了最大的灵活性,但在某些情况下可能不需要.至少你可以将大多数时候没想到的任何东西移动到参数列表的末尾.

  • 尽管更灵活,但您必须记住您应该/可以设置的参数(因为它们不在签名中).所以最终它可能没有看起来那么有用,但当然这取决于背景. (3认同)
  • 我会将'像这样的东西'识别为'使用数组来模拟命名参数',FWIW.:) (2认同)

Cri*_*tik 35

不,不可能以这种方式跳过论证.只有当它们位于参数列表的末尾时,可以省略传递参数.

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

  • 当然!有关此内容的 PHP 文档位于[此处](https://wiki.php.net/rfc/named_pa​​rams) 和[此处](/sf/ask/94003591/ -so-that-Optional-arguments-can-be-omiss-from-f#answer-64997399) 已经是 Stackoverflow 上的一个答案...以及下面的一个答案。 (3认同)
  • PHP支持默认参数值。但是这些参数必须在列表的末尾。 (2认同)
  • 抽搐.让我很生气.如果您不喜欢别人要求的功能,请不要使用它.互联网有时是最糟糕的. (2认同)
  • 2022 年 PHP 8.x 的答案是错误的。 (2认同)

Aam*_*irR 14

该功能在 PHP 8.0 中实现

PHP 8 引入了命名参数

哪个:

允许任意跳过默认值

参考文档

使用此功能无需进行任何更改:

让我们使用OPs函数function getData($name, $limit = '50', $page = '1')

用法

getData(name: 'some name', page: '23');
Run Code Online (Sandbox Code Playgroud)

原生函数也会使用这个特性

htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
Run Code Online (Sandbox Code Playgroud)

支持的 Netbeans IDE 12.3 功能

支持此功能,但命名参数的代码完成除外,看起来更好;)

在此输入图像描述


Ibr*_*wal 5

关于能够跳过可选参数没有任何改变,但是为了正确的语法并且能够为我想要跳过的参数指定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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


Nel*_*alo 5

简单的答案是否定的。但是为什么在重新排列参数时跳过会实现这一点呢?

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

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
Run Code Online (Sandbox Code Playgroud)

输出将是:

"Select * FROM books WHERE name = some name AND page = 23 limit"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

输出将是:

"Select * FROM books WHERE name = some name AND page = 23 limit 50"
Run Code Online (Sandbox Code Playgroud)

在非默认值之后将默认值放在您的右侧,以确保如果未定义/给出该变量,它将始终重新调整该变量的默认值这是一个参考链接以及这些示例的来源。

编辑:将其设置null为其他人建议的可能有效并且是另一种选择,但可能不适合您想要的。如果未定义,它将始终将默认值设置为 null。