了解命名参数
命名参数 是一种在调用包含大量参数的函数或方法时避免混淆的方法。这不仅有助于避免以不正确的顺序提供参数的问题,还有助于跳过带有默认值的参数。在本节中,您将学习如何使用命名参数来提高代码的准确性,减少未来维护周期中的混乱,并使方法和函数调用更加简洁。首先,我们将研究使用命名参数所需的通用语法。
命名参数通用语法
要使用命名参数,需要知道函数或方法签名中使用的变量的名称。然后指定变量名,去掉美元符号,后面加上冒号和要提供的值,如下所示:
$result = function_name( arg1 : <VALUE>, arg2 : <value>);
调用 function_name()
函数时,将把值传递给与 arg1
、arg2
等参数相对应的参数。
使用命名参数调用核心函数
使用命名参数的最常见原因之一是调用有大量参数的 PHP 核心函数。例如,下面是 setcookie()
的函数签名:
setcookie ( string $name [, string $value = ""
[, int $expires = 0 [, string $path = ""
[, string $domain = "" [, bool $secure = FALSE
[, bool $httponly = FALSE ]]]]]] ) : bool
比方说,你只想设置 name
、value
和 httponly
参数。在 PHP 8 之前,您必须查找默认值并按顺序提供,直到找到您想覆盖的值为止。在下面的例子中,我们希望将 httponly
设置为 TRUE
:
setcookie('test',1,0,0,'','',FALSE,TRUE);
使用命名参数,PHP 8 中的等价参数如下:
setcookie('test',1,httponly: TRUE);
请注意,我们不需要为前两个参数命名,因为它们是按顺序提供的。
在 PHP 扩展库中,命名的参数并不总是与函数或方法签名的 PHP 文档中的变量名一致。例如,函数 如果遇到致命错误 未知命名参数 |
顺序独立性和文档
命名参数的另一个用途是提供 顺序独立性。此外,对于某些核心 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 中,图像创建函数(例如 |
因此,使用命名参数,以下函数调用在 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 |