我对可选参数或一般在函数中设置参数有点困惑。所以我找到了这个例子:
<?php
function makecoffee($type = "cappuccino")
{
return "Making a cup of $type.n";
}
echo makecoffee();
echo makecoffee(null);
echo makecoffee("espresso");
?>
我不明白为什么echo makecoffe("浓缩咖啡"(返回浓缩咖啡而不是卡布奇诺。调用该方法时不会覆盖浓缩咖啡吗?在我的脑海中$type
首先是浓缩咖啡,但随后会设置为卡布奇诺,因为它发生在调用该方法之后。很难解释我的意思,但是只有在没有参数时才调用$type = "cappuccino"
或者为什么会发生这种情况?与
function makecoffee($type = null)
{
}
echo makecoffe("espresso");
为什么这会返回浓缩咖啡而不是 null,即使调用函数时类型设置为 null?
告诉您函数中的 php 参数究竟是如何工作的好例子,是将所有传递的参数返回给函数的func_get_args()
。
这将是我们的示例函数。
function foo($example = 'default')
{
print_r(func_get_args());
}
现在我们可以检查是否有任何参数传递给函数。
如果我们不传递任何参数会发生什么?
foo();
// Output
Array
(
)
我们知道调用该函数时没有任何参数,因为输出数组为空。 这就是将默认值用于我们的函数参数的时刻。因此,最终$example
参数的值将等于'default'
现在我们将尝试将 2 个参数传递给函数。
foo('example', 'unnecessary');
// Output
Array
(
[0] => example
[1] => unnecessary
)
从这个例子中,我们可以推断出我们可以传递任意数量的参数而不会看到异常。这是 php 功能之一。
但是哪个传递给$example
参数?
正如 php 文档所告知的那样。
参数从左到右计算。
我们示例的左侧是索引为 0 的数组中的值,右侧是最后一个元素(实际上是索引 1(
因此,在$example
下,我们'example'
价值。
在默认值中,第二个参数将被忽略,因为我们的函数没有相应的第二个参数。
如果我们把null
作为论据传递呢?
这可能很棘手,因为我们可以想象以null
作为参数调用的函数会影响我们的函数,因为调用的函数没有任何参数。
没有更多的错误。
foo(null);
// Output
Array
(
[0] =>
)
现在你应该看到这一点。尽管我们的参数是null
的,但值被传递到我们的函数中并覆盖了参数的默认'example'
值。最后$example
参数将等于null
。
这是因为函数声明中的$param = 'value'
位不会在每次调用函数时执行。
仅当您不为该参数传递值时,它才会发挥作用。
PHP不是将其视为文字赋值,而是在进入您的函数时在引擎盖下执行类似以下内容的操作。
if true === $param holds no value
$param = 'value'
endif
换句话说,$param = 'value'
不是语言上下文中的文字表达式,而是一种语言构造,用于定义实现回退默认值的所需行为。
编辑:请注意,上面的代码片段故意只是伪代码,因为一旦 PHP 编译完毕,就很难准确表达使用 PHP 的内容。有关详细信息,请参阅评论。