3

我最近一直在做很多 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 吗?

4

5 回答 5

4

使用 usingcalculateArea( $width = 10, $height = 5 )时,您不会像在Python等其他语言中那样按名称指定参数。

相反$width = 10$height = 5在函数调用中只是两个变量赋值表达式

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

赋值表达式的值就是赋值的值。即“ $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)
于 2011-04-30T18:33:28.027 回答
4

我认为这是一个坏主意,从如果您弄错订单就没有任何安全性的角度来看。使用地图是一种更安全的模拟方式。您还具有在本地范围内设置这些变量的值的副作用,这可能是也可能不是问题。

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

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

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

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

function calculateArea( $dimensions ) {
    $width = $dimensions['width'];
    $height = $dimensions['height'];
}
于 2011-04-30T18:33:34.657 回答
2

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

于 2011-04-30T18:32:34.423 回答
0

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

计算面积(10,5);

或这个:

计算面积($宽度,$高度);

或这个:

计算面积($xvar,5);

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

计算面积($width = 10, $height = 5);

做这个:

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

或这个:

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

它们都具有相同的效果,但是在函数外部声明变量可以清楚地说明它们的作用域是什么。

于 2011-04-30T18:34:16.793 回答
0

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

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

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

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

于 2011-04-30T20:15:24.173 回答