PHP 是否允许命名参数,以便可以在函数调用中省略可选参数?
PHP 中是否可以在调用函数/方法时指定命名可选参数,跳过您不想指定的参数(就像在 python 中一样)?
像这样的东西:
function foo($a, $b = '', $c = '') {
// whatever
}
foo("hello", $c="bar"); // we want $b as the default, but specify $c
Is it possible in PHP to specify a named optional parameter when calling a function/method, skipping the ones you don't want to specify (like in python)?
Something like:
function foo($a, $b = '', $c = '') {
// whatever
}
foo("hello", $c="bar"); // we want $b as the default, but specify $c
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
PHP 8.0 添加了对命名参数的支持,并接受 RFC。
例如,在示例中仅传递第三个可选参数:
在 PHP 8 之前,PHP 中不可能使用命名参数。从技术上讲,当您调用
foo($timeout=3)
时,它首先评估$timeout=3
,结果为3
并将其传递为foo()
的第一个参数。 PHP 强制执行参数顺序,因此类似的调用需要为foo("", "", $timeout=3)
。您还有其他两个选择:向 PHP 询问参数func_get_args()
或使用...
PHP 5.6+ 中的可变长度参数功能。根据参数的数量,您可以决定如何处理每个参数。许多 JQuery 函数都会执行类似的操作。这很简单,但对于那些调用函数的人来说可能会感到困惑,因为它也不是自记录的。而且你的论点仍然没有被命名。PHP 8.0 added support for named arguments with the acceptance of an RFC.
E.g. to pass just the 3rd optional parameter in your example:
Prior to PHP 8 named parameters were not possible in PHP. Technically when you call
foo($timeout=3)
it is evaluating$timeout=3
first, with a result of3
and passing that as the first parameter tofoo()
. And PHP enforces parameter order, so the comparable call would need to befoo("", "", $timeout=3)
. You have two other options:func_get_args()
or use the...
variable length arguments feature in PHP 5.6+. Based on the number of parameters you can then decide how to treat each. A lot of JQuery functions do something like this. This is easy but can be confusing for those calling your functions because it's also not self-documenting. And your arguments are still not named.不,这是不可能的(在 PHP 8.0 之前): 如果要传递第三个参数,则必须传递第二个参数。并且命名参数也是不可能的。
A "solution" would be to use only one parameter, an array, and always pass it... But don't always define everything in it.
例如:
并以这种方式调用它:(键/值数组)
将为您提供以下输出:
但我真的不喜欢这个解决方案:
所以我只会在非常特殊的情况下才使用它 - 例如对于具有大量可选参数的函数......
No, it is not possible (before PHP 8.0): if you want to pass the third parameter, you have to pass the second one. And named parameters are not possible either.
A "solution" would be to use only one parameter, an array, and always pass it... But don't always define everything in it.
For instance :
And calling it this way : (Key / value array)
Will get you this output :
But I don't really like this solution :
So I'd go with this only in very specific cases -- for functions with lots of optional parameters, for instance...
PHP 8 于 2020 年 11 月 26 日发布,新增了一项名为 命名参数。
在此主要版本中,“命名参数”(又名“命名参数”)为开发人员在调用本机和自定义函数时提供了一些非常酷的新技术。
现在可以使用第一个参数调用此问题中的自定义函数(因为它没有默认值),然后仅使用命名参数传递第三个参数,如下所示: (Demo)
请注意,第二个参数不需要在函数调用中声明,因为它定义了默认值——默认值会在函数体内自动使用。
这个新功能的优点之一是您不需要注意命名参数的顺序——它们的声明顺序是无关紧要的。 foo(c: "bar", a: "hello"); 的工作原理是一样的。具有“跳过”声明和编写声明性参数的能力将提高脚本的可读性。这个新功能的唯一缺点是函数调用会有点臃肿,但我(和许多其他人)认为好处超过了这种“成本”。
下面是一个本机函数省略
limit
参数、不按正常顺序写入参数并声明引用变量的示例。 (演示)有关此新功能的更多信息。您甚至可以使用关联数组将命名参数传递给函数,其中可以使用 spread/splat 运算符来解包数据!
(*注意声明引用变量时的细微差别。)(演示)
可以通过 <代码>call_user_func_array()。 使用我的第一个声明的用户函数进行演示
有关更多信息,这里有一些进一步解释此功能的线索以及一些常见的相关错误:(我与以下站点没有隶属关系)
PHP 8 was released on November 26, 2020 with a new feature called named arguments.
In this major version release, "named parameters" (aka "named arguments") afford developers some really cool new techniques when calling native and custom functions.
The custom function in this question can now be called with the first parameter (because there is no default for it) and then only the third parameter passed by using named parameters like this: (Demo)
Notice that the second parameter did not need to be declared in the function call because it has a default value defined -- the default value is automatically used within the function body.
Part of the beauty of this new feature is that you don't need to be careful about the order of your named parameters -- the order of their declaration is irrelevant. foo(c: "bar", a: "hello"); works just the same. Having the ability to "skip" declarations and write declarative parameters will improve the readability of your scripts. The only downside of this new feature is that there will be a little bit more bloat in the function calls, but I (and many others) think the benefits outweigh this "cost".
Here is an example of a native function omitting the
limit
parameter, writing the parameters out of their normal order, and declaring a reference variable. (Demo)There is more to tell about this new feature. You can even use an associative array to pass the named parameters to the function where the spread/splat operator can be used to unpack the data!
(*notice the slight difference in declaring the reference variable.) (Demo)
The same behavior can be enjoyed via
call_user_func_array()
. Demo using my first declared user functionFor more information, here are a few leads that explain further about this feature and some common related errors: (I have no affiliation with the following sites)
PHP 不直接支持命名参数。
在 PHP 中,您可以使用相当合理的替代品。 PHP 的数组处理特别好,您可以使用关联数组来传递参数数组,如下所示:
请注意,如果输入数组元素不存在,则使用
??
运算符允许简单的默认值不存在。在 PHP 7 之前,您将使用?:
,它略有不同,但在这种情况下给出相同的结果。命名参数虽然不那么巧妙,但还有另一个重要作用:它们允许您使用大量选项,而无需使用过长的有序参数列表。
编写该函数的另一种方法是使用
extract
函数:这里
extract
函数将值复制到变量中,但前提是它们已经被定义。这可以防止导入您不知道的变量。PHP did not directly support named parameters.
In PHP, you can use a fairly reasonable substitute. PHP’s array handling is particularly good, and you can use an associative array to pass an array of parameters, as follows:
Note the use of the
??
operator to allow a simple default if the input array element doesn’t exist. Before PHP 7, you would use?:
which is subtly different, but gives the same result in this case.Not as slick, but named parameters have another important role: they allow you to work with a large number of options without an excessively long list of ordered parameters.
An alternative way of writing the function is to use the
extract
function:Here the
extract
function copies the values into the variables, but only if they have already been defined. This prevents importing variables you didn’t know about.PHP 8 支持命名参数。
这意味着什么?
本机函数和当前代码都可以使用命名参数。
它是如何运作的?
假设您定义了一个函数:
您现在可以像这样调用该函数:
PHP 8 supports named arguments.
What does this mean?
Both native functions and your current code can use named parameters.
How does it work?
Let's say you have a function defined:
you will now be able to call this function like so:
不,PHP 不能按名称传递参数。
如果您有一个需要大量参数的函数,并且所有参数都有默认值,您可以考虑让该函数接受参数数组:
查看实际效果。
No, PHP cannot pass arguments by name.
If you have a function that takes a lot of arguments and all of them have default values you can consider making the function accept an array of arguments instead:
See it in action.
PHP 7.* 或更低版本不支持命名参数。
命名参数从 PHP 8.0 开始实现。
批准的 RFC:https://wiki.php.net/rfc/named_params
Stitcher 博客:< a href="https://stitcher.io/blog/php-8-named-arguments" rel="nofollow noreferrer">https://stitcher.io/blog/php-8-named-arguments
Named Arguments are not supported in PHP 7.* or lower.
Named Arguments are implemented since PHP 8.0.
Approved RFC: https://wiki.php.net/rfc/named_params
Stitcher blog: https://stitcher.io/blog/php-8-named-arguments
不,不是。
唯一可以做到这一点的方法是使用带有命名键的数组以及其他的数组。
No, it isn't.
The only way you can somewhat do that is by using arrays with named keys and what not.
您可以通过传递对象而不是数组来保留 phpdoc 和设置默认值的能力,例如,
如果您愿意,这还可以让您在函数调用中进行严格的类型检查:
当然,您可能会为此付出额外的冗长代价设置 FooOptions 对象。不幸的是,没有完全免费的旅程。
You can keep the phpdoc and the ability to set defaults by passing an object instead of an array, e.g.
That also lets you do strict type checking in your function call, if you want to:
Of course, you might pay for that with extra verbosity setting up the FooOptions object. There's no totally-free ride, unfortunately.
从 PHP 5.4 开始,您可以使用简写数组语法(不必使用繁琐的“array”指定数组,而是使用“[]”)。
您可以通过多种方式模仿命名参数,一种好的且简单的方法可能是:
As of PHP 5.4 you have shorthand array syntax (not nessecary to specify arrays with cumbersome "array" and instead use "[]").
You can mimic named parameters in many ways, one good and simple way might be:
有些人可能会说,它并不完全漂亮,但它确实有效。
It's not exactly pretty, but it does the trick, some might say.
通常你不能,但我认为有很多方法可以将命名参数传递给 PHP 函数。就我个人而言,我使用数组来传递定义,然后只调用我需要传递的内容:
此处的实时示例:
,
如果我必须传递 10 个参数 其中 3 个是我真正需要的数据,传递到函数中是不明智的,例如
使用我给出的方法,您可以将 10 个参数中的任何一个设置到数组中:
我的博客中有一篇文章解释了这个过程的更多细节。
http://www.tbogard .com/2013/03/07/将命名参数传递给php中的函数
Normally you can't but I think there a lot of ways to pass named arguments to a PHP function. Personally I relay on the definition using arrays and just call what I need to pass:
live example here:
http://sandbox.onlinephpfunctions.com/code/d7f27c6e504737482d396cbd6cdf1cc118e8c1ff
If I have to pass 10 arguments, and 3 of them are the data I really need, is NOT EVEN SMART to pass into the function something like
With the approach I'm giving, you can setup any of the 10 arguments into an array:
I have a post in my blog explaining this process in more details.
http://www.tbogard.com/2013/03/07/passing-named-arguments-to-a-function-in-php
这是我一直在使用的。函数定义采用一个可选数组参数,该参数指定可选命名参数:
您通常可以在没有任何命名参数的情况下进行调用:
要指定可选命名参数,请将其传递到可选数组中:
Here's what I've been using. A function definition takes one optional array argument which specifies the optional named arguments:
You can normally call without any named arguments:
To specify an optional named argument, pass it in the optional array:
只需使用 Drupal 使用的关联数组模式即可。对于可选的默认参数,只需接受一个
$options
参数,它是一个关联数组。然后使用数组+
运算符设置数组中缺少的键。Just use the associative array pattern Drupal uses. For optional defaulted arguments, just accept an
$options
argument which is an associative array. Then use the array+
operator to set any missing keys in the array.如果你真的想要的话,可以尝试一下反射。
并用 null 跳过。
If you really really want, try the reflection.
And skip with null.