PHP核心函数参数;手册说引用,但它接受值



我注意到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中从来没有见过这样的混淆。

最新更新