【问题标题】:PHP core function arguments; manual says reference, however it accepts valuesPHP 核心函数参数;手册说参考,但它接受值
【发布时间】:2011-08-16 18:46:01
【问题描述】:

我注意到 PHP 手册中有一些不一致之处;许多核心函数签名被记录为通过引用接受参数,但是它们通过值接受参数。

我之前发布了更多 specific question,@cweiske 提供了一个很好的答案(参考相关的 PHP 源代码)但是这些不一致似乎更加猖獗。

有许多功能受此影响(我将更新此列表作为保证;另请注意,这些测试是在 error_reporting(-1) 环境中完成的

现在我很担心,不是因为我对文档不屑一顾,而是因为我担心 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() 调用

我应该关心这个吗?我正在考虑提交与文档相关的错误请求,但我首先想知道 SO 上的任何人(看着你的方向@cweiske)是否对为什么有洞察力已经完成了。

【问题讨论】:

    标签: php function-signature


    【解决方案1】:

    也许我不理解您的困境,但这些函数不会直接修改其参数中的数据,所以它们是通过引用还是通过值接受是一个有争议的问题,不是吗?无论哪种方式,如果您希望函数调用真正为您任何事情,您都需要分配返回值。

    为什么您可能会看到差异的洞察力而言。 PHP 5 对引用的工作方式进行了许多更改。事实上,我相信 PHP 5.3+ 不再允许通过引用分配 & 的某些用法。您可能会看到一些 PHP 核心函数的转换,以符合有关引用分配的新规则。如果我没记错的话,PHP 5.3 分支实际上是打算成为 PHP 6 的,但它明确地作为一个分支合并到了主干中,而不是等待几个复杂的功能完成。这可以解释为什么您以前从未在 PHP 中看到过这样的混乱。

    【讨论】:

    • 谢谢@Brian - 我的困境在于,PHP 开发人员可能已经明确记录了这一点,因为即将发生变化,这一点并不重要。如果函数修改参数,那么为什么要通过引用来定义它们呢?如果函数确实修改了参数,那么为什么要接受传递的值呢?如果这是一个文档疏忽,并且对于 5.4,以及所有版本更改/分支(如您所提到的;5.3、6.0 等),那么它是完全可以理解的。然而,实现允许传递值。这似乎不对,我只想知道为什么。
    • 啊,我知道你要去哪里了,你担心的是,他们是否打算修改这些函数的工作方式,允许它们将参数作为参考并直接处理它们而不是要求要返回的函数的结果?我可以看到这可能是一个问题:P 不幸的是,我也不是通常深入研究 PHP 源代码的人,所以我将把问题的解决留给堆栈中的一个书呆子;)
    猜你喜欢
    • 2012-04-24
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多