PHP -在函数参数中赋值-很好的实践


PHP - assigning values in a function argument - good practice?

在函数调用中设置变量值-我没有看到很多,这被认为是好的做法吗?

function myUpdate($status){
    ...
}
myUpdate($status = 'live');

我个人喜欢它,因为它更具描述性。我更经常看到相反的情况。

这是一个非常糟糕的主意,因为它基本上是代码混淆。php 不支持关键字参数,这可能会导致奇怪的事情。例子:

function f($a, $b){
    echo 'a: ' . $a . "'n";
    echo 'b: ' . $b . "'n";
}
f($b='b-value', $a='a-value');

这个程序不仅输出

a: b-value
b: a-value

在全局上下文中定义变量$b$a。这是因为

f($b='b-value', $a='a-value');
// is the same thing as ...
$b = 'b-value';
$a = 'a-value';
f($b, $a);

有一些好的实践可以使记住方法参数更容易:

  • 配置你的编辑器/IDE在高亮处显示函数的签名
  • 如果一个函数有很多描述某种状态的参数,请考虑将其移动到一个*对象*t(而不是保存状态)
  • 如果你的函数只需要很多参数,让它使用一个数组来存放所有非必要的参数。这也允许方法调用者完全不用担心大量的选项,她只需要知道她感兴趣的选项。

别开玩笑了,说真的,你为什么要用它?你必须意识到这和分配一个默认值是完全不同的。你在这里做的是将值赋给一个变量,然后将这个变量传递给函数。结果是,在函数调用之后,$status变量仍然是定义的。

myUpdate( $status = 'live' );
echo $status; // "live"

即使这是你想要的,我也会说不那么具有描述性,而只是分成两行。

不,不是因为它是额外的代码。试一试:

myUpdate('live' /*status*/, 42 /*maxTries*/);

或者如果你真的想要命名参数,你可以使用map:

myUpdate(array(
    'status' => 'live'
));

通常情况下它会取消类型安全,但是PHP没有。

嗯,默认值是不同的。

// if you call myUpdate without argument, it will have $status with value live
function myUpdate($status = 'live'){
}
调用:

myUpdate($status = 'live');

等价于:

myUpdate('live');

唯一的区别是,在调用之后,如果你像myUpdate($status = 'live');一样调用它,你将在调用函数的作用域中保留值为live$status var,而不是在它内部。

但是我觉得这样更容易读懂:

$status = 'live';
myUpdate($status);