【问题标题】:array_walk params userdata modifiedarray_walk 参数用户数据已修改
【发布时间】:2023-03-10 15:55:01
【问题描述】:

我在我的应用程序中发现了一些奇怪的东西。

很难描述我的概率,因为我无法与您分享可复制的样本。

主要问题是关于array_walk函数的第三个参数。

$row = array("user_id" => 1, "first_name" => "bobby");
$data = array("user_id" => "fc_name", "first_name" => "fc2_name", "email" => "fc3_name");
$res = array_walk( $row, 'fu', $aParams);

function fu(&$cell, $key, $data) {
    return call_user_func_array($data[$cell], array($cell, $key, $data));
}

当我运行脚本时,它被中止且没有错误。 调试后发现$data被修改成了递归数组。

Array
 *RECURSION*

我无法理解 $data 在通过 copy 传递时如何修改? 我知道您没有关于执行的所有信息,并且在 call_user_func_array 中还有许多其他调用。

谢谢

PS:我使用 Xdebug 记录了所有跟踪,但我找不到奇怪的东西。


UPDATE1:如果我在 foreach 循环中翻译 array_walk 没问题

UPDATE2:Update1 让我明白问题不是纯粹的 PHP 代码,我为什么要寻找“堆栈溢出”(真正的 :))或段错误。我在官方 php 错误报告 https://bugs.php.net/bug.php?id=61730 上发现了这个错误,而且我的 php 版本不固定(5.3.2)我检查了我的 array.c。场景很接近我,所以我会尽可能更新 php(企业流程......)。

我期待这个修复很多。

【问题讨论】:

  • array_walk() 通话中$aParams 应该是$data 吗?
  • 是的,它是在 params 中传递的 $aParams 的副本
  • 我在官方 php 错误报告 (bugs.php.net/bug.php?id=61730) 上发现了一些有趣的东西。我检查了我的 array.c 未应用修复(5.3.2)我将尽快尝试新的 php 版本(我无法轻松更改版本 atm 但我会在完成时报告)

标签: php segmentation-fault


【解决方案1】:

PHP 错误 https://bugs.php.net/bug.php?id=61730 已在 php 5.3.10 上修复 刚刚更新了php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多