为什么命名参数在PHP中工作?

为什么命名参数在PHP中工作?,php,named-parameters,Php,Named Parameters,我最近在PHP中发现了一些似乎使用命名参数的代码,对此感到惊讶 $this->setCellPaddings ($left = '', $top = '', $right = '', $bottom = '1'); 不幸的是,一个快速的测试证实了我的担心:只有顺序才重要。如果我删除前三个参数,只传入$bottom,我希望一切都能正常工作,但这完全是基于位置来解释的,因此左侧填充由该函数设置,而不是底部填充 $this->setCellPaddings ($bottom = '1')

我最近在PHP中发现了一些似乎使用命名参数的代码,对此感到惊讶

$this->setCellPaddings ($left = '', $top = '', $right = '', $bottom = '1');
不幸的是,一个快速的测试证实了我的担心:只有顺序才重要。如果我删除前三个参数,只传入
$bottom
,我希望一切都能正常工作,但这完全是基于位置来解释的,因此左侧填充由该函数设置,而不是底部填充

$this->setCellPaddings ($bottom = '1');
谷歌搜索证实了这一点


那么:为什么会这样呢?为什么PHP允许您将赋值插入期望值的位置?

它们不是命名参数。它们是具有默认值的常规参数(用于在调用中忽略它们时)。如果省略参数,则必须从右向左。

这是有效的,因为赋值是返回值的表达式:

$a = $b = '1';
var_dump($a);
产出:

string(1) "1"
也就是说,代码似乎正在传递一个值,同时为其设置一个变量。与:

$left = '';
$top = '';
$right = '';
$bottom = '1';
$this->setCellPaddings($left, $top, $right, $bottom);

我猜作者这样做是因为变量以后会再次使用。

不是我,但这并不完全正确。如果我发布的代码是函数签名,那么你所说的是正确的,但这是一个函数调用,这是不正确的。他展示的是函数调用,而不是函数定义。@PhilPerry:是你为了报复而否决了我的问题吗?我怀疑是这样的,但我认为这是关于StackOverflow的有用信息,我还猜测,有人的回答速度可能比我进行测试的速度快,以证实我的怀疑,这就是PHP处理任务的方式。你赢了!有些编码风格要求这种赋值,即使你以后不使用变量,因为它澄清了你的调用,而读者不必查看函数/方法签名。是的,我可以这样使用,虽然我有点担心设置变量超出功能调用范围的副作用。如果你担心调用的可读性,你可能会考虑转换函数定义来使用关联数组,然后你可以做:<代码> $Foo> bar([底部]=1,“左”=0)最好澄清一下,在第二个代码示例中,函数外部的变量
$bottom
将具有值
1
,而函数中的变量
$left
将具有值
1
。这一点很好。一个不经意的读者可能不会注意到“命名参数”的位置发生了变化,从而破坏了一切。是否有理由否决投票?这是有用的信息,不是每个人都知道的。将此设置为StackOverflow非常有用。答案并非每个人都清楚。