"请注意,使用默认参数时,任何默认值都应位于任何非默认参数的右侧;否则,事情将无法按预期发挥作用。"
引用上述句子 http://www.php.net/manual/en/functions.arguments.php
我记得我通过的所有编程语言对于默认参数都有相同的规则,我想知道,为什么会这样?是否有某种编译器或解释器规则或限制使其成为必须的?或者,如果我们想制作自己的编译器,可以修复此规则吗?
答案 0 :(得分:2)
这种限制的原因是否则无法确定您试图传递的参数。让我们假设以下功能:
function foo($first = 'default', $second = 'default', $third) { ... }
现在我们用foo('custom value', 'another value');
调用它。 another value
显然是$third
的值,但custom value
代表什么参数? $first
或$second
?你只能猜测和猜测编程语言是一件非常糟糕的事情,因为它限制了程序员的可预测性。
修复它的方法是命名参数传递。在PHP中,这可能看起来像foo($first='custom value', 'another value');
。现在,您可以清楚地知道您要覆盖哪个默认值。 Python支持这样的语法,但PHP还没有(还)。我认为已经有一些讨论要添加这个功能,但到目前为止还没有完成。
答案 1 :(得分:1)
因为基本上你有:函数F($ a = 0,$ b); 如果你想用空的$ a来调用这个函数,你该怎么办?口译员怎么知道你填的是$ b而不是$ a?
这个怎么样:函数F($ a = 0,$ b = 0,$ c); 而你想传递$ b和$ c? F(0,1)? A和C? B和C?
答案 2 :(得分:1)
发生这种情况的原因比你想象的要简单。我将基于您提供的同一页面上的示例。
示例#5默认函数参数的使用不正确
<?php
function makeyogurt($type = "acidophilus", $flavour)
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt("raspberry"); // won't work as expected
?>
首先,为什么函数有默认参数?通常这是为了节省您的时间,因此您只能提供非默认值。由于参数被解析为从左到右的功能,所以使用示例#5,您会看到执行makeyogurt("raspberry")
时会出现错误。该错误是因为您向raspberry
函数提供的第一个参数(makeyogurt()
)已分配给$type
,从而导致$flavour
未分配并引发错误。
使函数以相同的定义工作的唯一方法是使用它:
echo makeyogurt("acidophilus", "raspberry");
虽然这可以按预期工作,但它确实会使makeyogurt()
函数的默认值$ type过时。如果我们每次调用函数时都必须传递它,那么就没有必要指定它。
这个,简单的解决方案(以及经验法则)是让右边的所有参数都带有默认值,如下所示:
<?php
function makeyogurt($flavour, $type = "acidophilus") // <-- NOTE THIS
{
return "Making a bowl of $type $flavour.\n";
}
echo makeyogurt("raspberry"); // will work as expected
?>
现在有了这种定义,当你致电makeyogurt("raspberry")
时,你会得到预期的结果:
Making a bowl of acidophilus raspberry.
您还可以在必要时指定任何非默认$type
:
echo makeyogurt("raspberry", "plasma");
这将回应:
Making a bowl of plasma raspberry.