在PHP中命名这样的参数是一个坏主意吗?

时间:2011-04-30 18:27:01

标签: php named-parameters

我最近一直在做很多Objective-C编程,现在我回到PHP,我必须诚实,我想念命名参数(起初我讨厌它们,现在我爱它们,去图)。

无论如何,在PHP中,我有时会看到人们将数组作为命名参数的伪方式传递给函数(附加的好处是不必担心顺序),但有时会使函数编写过于复杂。此外,有时我想用命名参数调用函数,但有时它更容易和更快,而不是。

有人做这样的事情:

function calculateArea( $width, $height ) {
    // do calculations here...
}

// and then call the function like so:
calculateArea( $width = 10, $height = 5 );

似乎工作正常,至少在我的PHP版本中,我想知道其他人是否也使用这种技术作为命名参数的解决方法。我也想知道是否有人知道为什么我不应该这样做。

谢谢!

更新

感谢所有人的快速回复。为了使事情更清楚,我只想说我理解在大多数情况下传递关联数组是一个更好的选择,但有时你正在处理你已经编写过的函数而你不想改变它们的方式。在代码的每个部分都调用。有时你也在使用辅助框架,而且你无法控制函数的编写方式。

如果我正在查看一年前写的代码,我看到:echo $zc->expand('Foo', 'Bar', 10, 1, 0, null, null, array('class'=>'code'), false);,这不是很有帮助。

所以,为了改写我的问题,我基本上都是这样问:
有时通过赋值将参数传递给函数更容易阅读。这样做有什么缺点,它是否适用于所有版本的PHP?

5 个答案:

答案 0 :(得分:4)

使用calculateArea( $width = 10, $height = 5 )时,您没有按照Python等其他语言的名称指定参数。

而函数调用中的$width = 10$height = 5只是两个变量assignment expressions

这仍然按预期工作的原因是赋值表达式不只是赋值,而且还返回赋值:

  

赋值表达式的值是指定的值。也就是说,“$a = 3”的值为3。

因此,有效calculateArea( $width = 10, $height = 5 )使用与calculateArea相同的参数调用calculateArea(10, 5),但它也分配了两个变量:

calculateArea( $width = 10, $height = 5 );
var_dump($width);   // int(10)
var_dump($height);  // int(5)

答案 1 :(得分:4)

我认为,如果您的订单错误,那么您没有任何安全保障是一个坏主意。使用地图是一种更安全的模拟方法。您还有在本地范围内设置这些变量值的副作用,这可能是也可能不是问题。

calculateArea( $height = 5, $width = 10 ); # oops!

function calculateArea( $width, $height ) {
    // do calculations here...
}

使用数组(map),将它们放入的顺序无关紧要。

calculateArea( array( 'height' => 5, 'width' => 10 ) ) # yea!

function calculateArea( $dimensions ) {
    $width = $dimensions['width'];
    $height = $dimensions['height'];
}

答案 2 :(得分:2)

您不应在函数调用中使用变量赋值,因为它可能会导致意外结果。 calculateArea($a = 10, $b = 5)也有效。完成该函数调用后,$ a === 10和$ b === 5.如果这些变量在函数调用之前具有不同的值,则会覆盖这些值。

答案 3 :(得分:0)

您可以通过以下任何方式调用您的函数:

calculateArea(10,5);

或者这个:

calculateArea($宽度,$高度);

或者这个:

calculateArea($ XVAR,5);

但是在函数调用中分配值通常是不好的做法。它在技术上是正确的,但使代码难以阅读。而不是这样做:

calculateArea($ width = 10,$ height = 5);

这样做:

$width = 10;
$height = 5;
calculateArea( $width, $height );

或者这个:

$width = 10;
$height = 5;
calculateArea( 10, 5 );

它们都具有相同的效果,但声明函数外部的变量可以清楚地了解它们的范围。

答案 4 :(得分:0)

嗯,现在你知道,PHP没有这个功能。但是我想说,传递数组也是一种糟糕的方式。这样,你必须保留在内存中(或在最佳情况下的phddoc注释中),哪些键可以在数组中使用,你不能设置'默认值',你可以轻松地在数组的键名称中输入错字。
所以我更喜欢在这种情况下使用对象(因为PHP也没有'结构')。在对象中,您可以设置默认值,您可以在函数声明中设置所需对象的类型,在IDE中,您可以获得对象的字段名称的代码完整。 例如:

class DimensionsParams
{
    public $width = 5;
    public $height;
}

function calculateArea(DimensionsParams $params)
{
    // do calculations here...
    return $params->height*$params->width;
}

当然,它不是每个功能的最佳选择,但它是“命名参数”的最佳选择(在我看来)。