我注意到PHP手册中有一些不一致的地方;许多核心函数签名都是通过引用来接受参数的,但是它们通过值来接受参数。
我之前发布了一个更具体的问题,@cweiske提供了一个很好的答案(参考相关的PHP源代码),但是这些不一致似乎更加猖獗。
有许多函数受此影响(我将更新此列表作为保证;还要注意,这些测试是在error_reporting(-1)
环境中完成的)
- http://www.php.net/manual/en/function.current.php
- 这已经在链接问题 中讨论过了
- http://www.php.net/manual/en/function.key.php
- 这已经在链接问题 中讨论过了
罢工罢工 - <> http://www.php.net/manual/en/function.array-replace-recursive.php
- <罢工>
array
array_replace_recursive
( array
&$array
, array
&$array1
[, array
&$
... ] )
罢工 罢工> - 按值接受
$array
、$array1
等参数。
- <罢工>
- http://www.php.net/manual/en/function.array-multisort.php
-
bool
array_multisort
( array
&$arr
[, mixed
$arg
=
SORT_ASC
[, mixed
$arg
=
SORT_REGULAR
[, mixed
$
... ]]] )
- 按值接受参数
$arr
等。这应该抛出一个错误,因为它不会做任何事情,如果参数不是一个变量。
-
现在我很担心,不是因为我对文档很挑剔,而是因为我担心PHP开发人员对这些函数的实现细节(或同样不可靠的)持观望态度
例如,我使用array_replace_recursive()
来获取一个数组参数,并将其应用于另一个包含默认值的数组。我的一些代码库利用了这种不一致性,简单地这样做:
$values = array_replace_recursive(array(
'setting_1' => array(
'sub-setting_1' => '',
'sub-setting_2' => '',
'sub-setting_3' => '',
),
'setting_2' => array(
'sub-setting_1' => 0,
'sub-setting_2' => 0,
),
'setting_3' => true,
), $values);
从而产生一个正确格式化的数组(以避免不必要的isset()
调用)
我应该关心这个吗?我正在考虑提交一个与文档相关的bug请求,但我首先好奇的是,如果有人在SO (看着你的方向@cweiske)有洞察为什么这已经完成。
也许我不理解您的困境,但这些函数不直接修改其参数中的数据,因此它们是否通过引用或值接受是一种有争议的问题,不是吗?无论哪种方式,如果你想让函数调用为做任何事情,你都需要分配返回值。
在深入了解为什么时,您可能会看到差异。PHP 5对引用的工作方式做了很多修改。事实上,我相信是PHP 5.3+才不再允许使用&通过引用来分配您可能看到的是一些PHP核心函数的转换,以符合有关引用赋值的新规则。如果我没记错的话,PHP 5.3分支实际上是打算成为PHP 6的,但它果断地作为一个分支合并到主干中,而不是等待几个复杂的特性完成。这就解释了为什么在PHP中从来没有见过这样的混淆。