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

Php 为什么在所有编程语言中,默认参数必须始终位于任何非默认参数的右侧?,php,function,compiler-construction,interpreter,Php,Function,Compiler Construction,Interpreter,请注意,当使用默认参数时,任何默认值都应该位于任何非默认参数的右侧;否则,事情就不会像预期的那样发生 以上句子引自 我记得我所使用的所有编程语言对于默认参数都有相同的规则,我想知道,这是为什么?是否有某种编译器或解释器规则或限制使其成为必须的?或者,如果我想制作自己的编译器,这个规则可以被修正吗?因为基本上如果你有:函数F$a=0,$b; 如果要使用空$a调用函数,应该怎么做?口译员怎么知道你填的是b美元而不是a美元 那么这个呢:函数F$a=0,$b=0,$c; 你想通过b美元和c美元吗?F0

请注意,当使用默认参数时,任何默认值都应该位于任何非默认参数的右侧;否则,事情就不会像预期的那样发生

以上句子引自


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

因为基本上如果你有:函数F$a=0,$b; 如果要使用空$a调用函数,应该怎么做?口译员怎么知道你填的是b美元而不是a美元

那么这个呢:函数F$a=0,$b=0,$c;
你想通过b美元和c美元吗?F0,1?A和C?B和C?

因为基本上如果你有:函数F$a=0,$B; 如果要使用空$a调用函数,应该怎么做?口译员怎么知道你填的是b美元而不是a美元

那么这个呢:函数F$a=0,$b=0,$c;
你想通过b美元和c美元吗?F0,1?A和C?B和C?

此限制的原因是,否则将无法确定要传递的参数。让我们假设以下函数:

function foo($first = 'default', $second = 'default', $third) { ... }
现在我们用foo‘自定义值’、‘另一个值’;来称呼它;。另一个值显然是$third的值,但是自定义值代表什么参数$一美元还是二美元?您只能猜测,而猜测对于编程语言来说是一件非常糟糕的事情,因为它限制了程序员的可预测性


修复该问题的一种方法是命名参数传递。在PHP中,这可能看起来像foo$first='custom value','other value';。现在,您可以清楚地知道要覆盖哪个默认值。Python支持这样的语法,但PHP还不支持。我认为,关于添加此功能已经进行了一些讨论,但到目前为止还没有进行。

此限制的原因是,否则将无法确定您试图传递的参数。让我们假设以下函数:

function foo($first = 'default', $second = 'default', $third) { ... }
现在我们用foo‘自定义值’、‘另一个值’;来称呼它;。另一个值显然是$third的值,但是自定义值代表什么参数$一美元还是二美元?您只能猜测,而猜测对于编程语言来说是一件非常糟糕的事情,因为它限制了程序员的可预测性


修复该问题的一种方法是命名参数传递。在PHP中,这可能看起来像foo$first='custom value','other value';。现在,您可以清楚地知道要覆盖哪个默认值。Python支持这样的语法,但PHP还不支持。我想,已经有人讨论过添加此功能,但到目前为止还没有完成。

发生这种情况的原因比您想象的要简单。我将以您提供的同一页面上的示例为基础

示例5默认函数参数的不正确使用

<?php
function makeyogurt($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // won't work as expected
?>
虽然这会像预期的那样工作,但它确实会使make酸奶函数中的默认值$type过时。如果我们每次调用函数时都必须传递它,那么在那里指定它就没有意义了

这是一个简单的解决方案,也是一个经验法则,就是所有参数的默认值都在右边,如下所示:

<?php
function makeyogurt($flavour, $type = "acidophilus") // <-- NOTE THIS
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // will work as expected
?>
必要时,您还可以指定任何非默认$type:

echo makeyogurt("raspberry", "plasma");
这将反映:

Making a bowl of plasma raspberry.

发生这种情况的原因比你想象的要简单。我将以您提供的同一页面上的示例为基础

示例5默认函数参数的不正确使用

<?php
function makeyogurt($type = "acidophilus", $flavour)
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // won't work as expected
?>
虽然这会像预期的那样工作,但它确实会使make酸奶函数中的默认值$type过时。如果我们每次调用函数时都必须传递它,那么在那里指定它就没有意义了

这是一个简单的解决方案,也是一个经验法则,就是所有参数的默认值都在右边,如下所示:

<?php
function makeyogurt($flavour, $type = "acidophilus") // <-- NOTE THIS
{
    return "Making a bowl of $type $flavour.\n";
}

echo makeyogurt("raspberry");   // will work as expected
?>
必要时,您还可以指定任何非默认$type:

echo makeyogurt("raspberry", "plasma");
这将反映:

Making a bowl of plasma raspberry.

您可以随时制作自己的编译器,但这是一个实用性问题。。。。PHP从左到右读取和分配参数;因此,如果您有一个函数a$b,$c=1,并使用a5调用它,PHP将5分配给$b,$c将被分配默认值1,因为您没有传递第二个参数;如果您定义了函数a$b=1,$c,并用a5调用它,它仍会将5赋值给$b,但不知道如何处理$c,因此它只是出错。您可以随时制作自己的编译器,但这是一个实用性问题。。。。PHP从左到右读取和分配参数;因此,如果您有一个函数a$b,$c=1,并使用a5调用它,PHP将5分配给$b,$c将被分配默认值1,因为您没有传递第二个参数;如果你已经定义了你的函数a $b=1,$c并用a5调用它,它仍然将5分配给$b,但不知道如何处理$c,所以它只是出错