PHP中的默认函数参数

在PHP中创建函数时,可以提供默认参数,以便在不将参数传递给函数时,该参数仍可在函数中使用预定义的值。这些默认值也可以称为可选参数,因为它们不需要传递给函数。我最近看到这种代码经常被错误地使用,所以我认为我将在一篇博文中对其进行详细介绍。

在函数中创建默认参数非常简单,就像正常的变量分配一样。以下函数具有单个参数,如果在调用函数时未传递该参数,则将其设置为1。

function testFunction($a = 1)
{
    return $a;
}

此功能的作用不大,但可以按以下方式使用。如果未将参数添加到函数调用中,则使用默认值,如果添加了默认值,则使用该值。

echo testFunction(); // 版画1
echo testFunction(2); // 版画2

可以使用函数中所需数量的默认参数。以下函数具有四个参数,其中三个是可选的。

function testFunction($a, $b = 1, $c = 1, $d = 1)
{
    return $a + $b + $c + $d;
}

可以按以下方式运行此功能。

echo testFunction(1); // 版画4
echo testFunction(1, 2); // 版画5

也可以使用数组作为默认参数,如以下函数所示。

function testArrayFunction($array = array('someKey'))
{
    if (isset($array['someKey'])) {
        return $array['somekey'];
    }
}

创建默认参数时要记住的一件事是,应将其添加到函数具有的必需参数的末尾。在语法上编写默认参数不在函数定义末尾的函数是有效的,但这会导致问题。采取以下功能。

function testMultiFunction($a, $b = 1, $c, $d = 1)
{
    return $a + $b + $c + $d;
}

实际上不可能使用在任何非默认参数之前设置的任何默认参数。对于上面的代码,$b将永远无法用作默认值1。PHP无法知道您要跳过特定参数,因此将一如既往地按顺序分配它们。通过了。尝试跳过其中一个参数将导致语法错误。

echo testFunction(1, , 1); // syntax error

万一有些人认为应该可以简单地将null值添加为参数,则应注意,这也不起作用。本质上,您正在做的是传递一个值(在这种情况下为null),因此将不使用默认参数。使用上述功能,以下代码将打印3。这是1 + null + 1 + 1之和的结果,在计算中使用null值时将转换为0。

echo testFunction(1, null, 1); // prints 3

可以使用默认参数以某种方式控制功能。假设您要创建一个函数,如果命令执行此操作,则该函数将打印出一个变量。为此,您将创建第二个可选参数,如果传递true,则该参数将打印给定值。

function testFunction($a, $print = null)
{
    // Increment $a
    ++$a;
    if ($print === true) {
        // Print $a
        echo $a;
    }
    // Return $a
    return $a;
}

在许多CMS系统中,通常在模板函数中,都可以看到此函数样式,并且可以按以下方式运行。

testFunction(2, true); // prints and returns 3
testFunction(2); // returns 3
testFunction(2, false); // returns 3

我最常看到的错误是当程序员复制并粘贴函数定义并将其用作函数调用本身时。下面的代码(完全合法)调用testMultiFunction()上面的示例函数。

$a = 1;
echo testMultiFunction($a, $b = 1, $c = 1, $d = 1); // 版画4

我们在这里所做的是将变量$b,$c和$d定义为1,然后将它们以参数的形式传递给函数。在PHP中,可以在函数调用中运行代码,然后将其结果传递给函数。但是,这有点浪费,因为我们在此所做的所有操作(以及通常发生的事情)是定义在此函数调用之后永远不会使用的变量。要整理此代码,只需删除变量定义并保留要传递给函数的值即可。

$a = 1;
echo testMultiFunction($a, 1, 1, 1); // 版画4

它的输出与先前的代码相同,但是这是调用该函数的更简洁的方法。如果您担心无法告诉什么参数做什么,那么请在函数调用之前添加注释,该注释会为您提供更多信息。