我最近一直在做很多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?
答案 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;
}
当然,它不是每个功能的最佳选择,但它是“命名参数”的最佳选择(在我看来)。