了解命名参数

命名参数 是一种在调用包含大量参数的函数或方法时避免混淆的方法。这不仅有助于避免以不正确的顺序提供参数的问题,还有助于跳过带有默认值的参数。在本节中,您将学习如何使用命名参数来提高代码的准确性,减少未来维护周期中的混乱,并使方法和函数调用更加简洁。首先,我们将研究使用命名参数所需的通用语法。

命名参数通用语法

要使用命名参数,需要知道函数或方法签名中使用的变量的名称。然后指定变量名,去掉美元符号,后面加上冒号和要提供的值,如下所示:

$result = function_name( arg1 : <VALUE>, arg2 : <value>);

调用 function_name() 函数时,将把值传递给与 arg1arg2 等参数相对应的参数。

使用命名参数调用核心函数

使用命名参数的最常见原因之一是调用有大量参数的 PHP 核心函数。例如,下面是 setcookie() 的函数签名:

setcookie ( string $name [, string $value = ""
    [, int $expires = 0 [, string $path = ""
    [, string $domain = "" [, bool $secure = FALSE
    [, bool $httponly = FALSE ]]]]]] ) : bool

比方说,你只想设置 namevaluehttponly 参数。在 PHP 8 之前,您必须查找默认值并按顺序提供,直到找到您想覆盖的值为止。在下面的例子中,我们希望将 httponly 设置为 TRUE

setcookie('test',1,0,0,'','',FALSE,TRUE);

使用命名参数,PHP 8 中的等价参数如下:

setcookie('test',1,httponly: TRUE);

请注意,我们不需要为前两个参数命名,因为它们是按顺序提供的。

在 PHP 扩展库中,命名的参数并不总是与函数或方法签名的 PHP 文档中的变量名一致。例如,函数 imagettftext() 在其函数签名中显示了一个变量 $font_filename。但如果再向下滚动一点,就会在参数部分看到名为 fontfile 的参数。

如果遇到致命错误 未知命名参数 $NAMED_PARAM。请务必使用文档中 "参数" 部分列出的名称,而不是函数或方法签名中的变量名称。

顺序独立性和文档

命名参数的另一个用途是提供 顺序独立性。此外,对于某些核心 PHP 函数来说,参数数量之多简直就是文档的噩梦。

举例来说,请看 imagefttext() 的函数签名(请注意,该函数是本章制作安全验证码(CAPTCHA)图像项目的核心):

imagefttext ( object $image , float $size , float $angle ,
    int $x , int $y , int $color , string $fontfile ,
    string $text [, array $extrainfo ] ) : array

可以想象,在 6 个月后回顾自己的工作时,要记住这些参数的名称和顺序可能会很麻烦。

在 PHP 8 中,图像创建函数(例如 imagecreate())现在返回一个 GdImage 对象实例,而不是一个资源。GD 扩展中的所有图像函数都已重写,以适应这一变化。您无需重写代码!

因此,使用命名参数,以下函数调用在 PHP 8 中是可接受的:

// /repo/ch01/php8_named_args.php
// not all code is shown
$rotation = range(40, -40, 10);
foreach ($rotation as $key => $offset) {
    $char->writeFill();
    [$x, $y] = RotateText::calcXYadjust($char, $offset);
    $angle = ($offset > 0) ? $offset : 360 + $offset;
    imagettftext(
        angle : $angle,
        color : $char->fgColor,
        font_filename : FONT_FILE,
        image : $char->image,
        size : 60,
        x : $x,
        y : $y,
        text : $char->text);
    $fn = IMG_DIR . '/' . $baseFn . '_' . $key . '.png';
    imagepng($char->image, $fn);
    $images[] = basename($fn);
}

刚才的代码示例将一串扭曲的字符写成一组 PNG 图像文件。每个字符相对于其相邻图像顺时针旋转 10 度。注意命名参数是如何应用的,以使 imagettftext() 函数的参数更容易理解。

命名参数也可以应用于自己创建的函数和方法。下一节我们将介绍新的数据类型。

命名参数的详细分析可以在这里找到: https://wiki.php.net/rfc/named_params