Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中这样命名参数是个坏主意吗?_Php_Named Parameters - Fatal编程技术网

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

在PHP中这样命名参数是个坏主意吗?,php,named-parameters,Php,Named Parameters,最近我做了很多Objective-C编程,现在我又回到PHP,老实说,我错过了命名参数(起初我讨厌它们,现在我喜欢它们,想想看) 无论如何,在PHP中,我有时会看到人们将数组传递给函数作为命名参数的一种伪方法(还有一个好处,就是不必担心顺序),但有时这会使函数编写过于复杂。此外,有时我希望使用命名参数调用函数,但有时不使用命名参数更容易、更快 是否有人只是做了这样的事情: function calculateArea( $width, $height ) { // do calculat

最近我做了很多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中都能工作吗?

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

使用
calculateArea($width=10,$height=5)
您不会像在其他语言(如)中那样,通过名称指定参数

相反,函数调用中的
$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)

我认为这是一个坏主意,因为如果你的订单错了,你就没有任何安全。使用地图是一种更安全的模拟方法。在局部范围内设置这些变量的值也会产生副作用,这可能是个问题,也可能不是问题

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'];
}

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

计算earea(10,5)

或者这个:

计算面积($width,$height)

或者这个:

计算earea(xvar,5美元)

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

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

这样做:

$width = 10;
$height = 5;
calculateArea( $width, $height );
或者这个:

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

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

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

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

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

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

为什么不干脆
calculateArea(10,5)?@teresko我其实也想说同样的话@Philip您的问题不清楚,您到底在问什么?它在所有版本的PHP中都应该可以正常工作,但这是您想要的吗?要在功能范围之外定义
$width
$height
?PHP的参数不像Python的:
doSomething(宽度=10,高度=5)
。这类似于PHP中的
doSomething(数组('width'=>10,height=>5))
。@Rudie他没有在函数范围之外定义它们。他正在设置变量并将其传递给函数。在当前范围内,他可能不再需要变量。如果你想成为一名技术人员,他实际上是在制造一个内存泄漏。它确实有效,但在当前的PHP版本中实际上并没有使用。但只要您知道局部作用域的副作用,这就有助于可读性(对于冗长的参数列表)。但是这很少见。@Khez如果变量包含在函数中的某个地方,那么泄漏就不是那么大了。如果他处理的是一大堆可能被覆盖的全局变量,那么我确信将这些参数作为“命名变量”传递的必要性变得非常明显:P.真的有那么大的内存泄漏吗?如果你把这些值赋给函数调用之外的变量,那不是完全一样吗?@Philip Walton:这根本不是内存泄漏