为什么默认参数必须始终位于所有编程语言中任何非默认参数的右侧?

时间:2014-03-23 10:26:24

标签: php function compiler-construction interpreter

"请注意,使用默认参数时,任何默认值都应位于任何非默认参数的右侧;否则,事情将无法按预期发挥作用。"

引用上述句子 http://www.php.net/manual/en/functions.arguments.php

我记得我通过的所有编程语言对于默认参数都有相同的规则,我想知道,为什么会这样?是否有某种编译器或解释器规则或限制使其成为必须的?或者,如果我们想制作自己的编译器,可以修复此规则吗?

3 个答案:

答案 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.