PHP默认参数

19

在PHP中,如果我有一个像这样编写的函数

function example($argument1, $argument2="", $argument3="")

我可以像这样在其他地方调用这个函数:

example($argument1)

但是如果我想给第三个参数赋值,我应该这样做吗?

example($argument1, "", "test");

或者

 example($argument1, NULL, "test");

我认为这两种方法都可以,但哪种更好呢?因为如果在主函数中将$argument2的值更改了,并且我使用"",那么会有问题吗?或者NULL是最好的选择?

谢谢


1
你最后两个代码块应该是 example($argument1, "", "test");example($argument1, NULL, "test"); - thetaiko
4个回答

16

如果您想要传递一个空参数或者 null,但不想指定该参数的值,那么这些空值和 null 依然会被传递到函数中。

只有在调用代码中未设置某个参数时,才会使用该参数的默认值。例如,example('a') 将让参数 #2 和 #3 获取默认值,但如果您执行 example('a', null, ""),则函数中的参数 #3 是 null 而参数 #3 是空字符串,而不是默认值。

理想情况下,PHP 应该支持类似于 example('a', , "") 的语法,以允许使用参数 #2 的默认值,但这只是一种语法错误。

如果您需要在函数调用的中间省略参数,但又需要为后续参数指定值,则必须在函数本身中显式检查某些标志值并设置默认值。


以下是一些示例代码:

<?php

function example($a = 'a', $b = 'b', $c = 'c') {
        var_dump($a);
        var_dump($b);
        var_dump($c);
}

并且对于不同的输入:

example():
string(1) "a"
string(1) "b"
string(1) "c"

example('z'):
string(1) "z"
string(1) "b"
string(1) "c"

example('y', null):
string(1) "y"
NULL
string(1) "c"

example('x', "", null):
string(1) "x"
string(0) ""
NULL

请注意,一旦在函数调用中指定了任何参数,该值将传递给函数并覆盖在函数定义中设置的默认值。


但是如果你执行 example('a', null, ""),那么第三个参数是 null 而不是函数中的默认值空字符串 - 这意味着如果实际函数更改为具有不同的值,则调用者也需要进行更改。在这种情况下,调用者中的 NULL 有帮助吗? - JDesigns
我在您的其他评论中看到了这个问题的答案,所以我不能使用NULL。 - JDesigns
1
是的,你可以在调用中简单地传递默认值,但是如果你需要更改默认值,那么你必须在使用它的每个地方都更改函数调用。最好使用下面Fanis的答案,使用数组来指定参数。 - Marc B
谢谢。我现在无法使用数组方法,因为它涉及到几个更改...所以我猜我只能暂时将$argument2的默认值设置为"",假设主函数中$argument2的默认值不会改变。 - JDesigns

11

你可以使用以下任一方式:

example($argument1, '', 'test');

或者

example($argument1, NULL, 'test');

您可以始终使用 null 而不是空字符串来检查:

if ($argument === NULL) {
    //
}

我认为这完全取决于函数内部对参数的处理。


MarcB的回答比这个更合适。你不能只是这样使用它们并获得预期的结果。 - Octopus
@Octopus 为什么OP不能使用这个?我和MarcB做的一样吗?“你必须在函数本身中明确检查某些哨兵值”。 - PeeHaa
这个答案会让人误解的原因是其中的“可以”;实际上,如果你想要null被当作与''相同,必须在函数定义中添加一些东西。重要的是,这意味着在调用现有函数时,你不能自由地在两者之间选择,因为你必须知道所涉及的函数是否按预期处理它们。 - IMSoP

1

我认为如果您在函数定义中将可选参数定义为null并保持不变,那么您将得到更好的服务,因此可以调用它们作为example($argument1, NULL, $argument="test")。只需确保在函数本身中如何使用空参数以避免引发任何警告。只要您确定在函数本身中如何使用该参数,也可以使用false

如果您似乎经常遇到此问题,则更好的方法可能是使用单个关联数组来存储变量选项:

function example($optionsIn = array()) {

    $options = array(
        'var1' => null,
        'var2' => 'something',
        'var3' => 'else'
    ) ;

    $options = array_merge($options, $optionsIn) ;
}


$options = array(
    'var2' => 'different'
) ;

example($options) ;

这样,您可以传递任何您希望的函数参数,留下其他参数,并确保在函数内定义了适当的默认值。

唯一的缺点是预期的参数从函数签名中隐藏,但您可以在函数的文档块中记录它们。


使用关联数组可能是个好主意,但你必须小心不要过度使用它,因为它会使函数中发送/接收的参数变得模糊。你也可以依赖于可选参数的“设置器(setters)”。 - JF Dion
@Jeff 绝对没错。打字错误也是一个问题,我一直在通过定义常量来防范这种情况,例如对于将被其他人使用的核心函数:虽然可能不太美观,但输入 $options[OPT_URL] 是绝对可靠的,而且现代 IDE 还可以提供自动完成帮助。 - Fanis Hatzidakis

0

这取决于函数的规范。

function a($b=true,$c=false){
 echo $b?'true':'false';
 }

执行中

 a(NULL, 1);

结果为:false。但是简单的 a() 的结果为:true

这意味着您想要默认参数,那么您应该使用以下内容作为默认值:

 a(true, 1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接