呼叫时间传递参考警告

时间:2011-03-03 07:21:23

标签: php

    function heaviside(&$value, $key, &$array)
    {
            if($key > 0)
            $value = $array[$key-1].$array[$key];
    }

    function test_heaviside()
    {
            for($i=0; $i<10; $i++)
            {
                    $array[$i] = $i;
            }
            array_walk($array, 'heaviside', &$array);
            print_r($array);
    }

    test_heaviside();

我的问题是上面的代码会生成此警告:

  

PHP警告:通话时间   pass-by-reference已被弃用    - 按值传递的参数;如果您想通过参考传递,   修改声明   array_walk()。如果你愿意的话   启用呼叫时间传递引用,   你可以设置   allow_call_time_pass_reference为true   在你的INI文件中。但是,未来   版本可能不支持这个   更长的时间。

如果我删除&amp;在我调用array_walk的&amp; $数组中,此函数不会返回此正确的结果。在第一种情况下,它工作的地方,它返回这个结果:

[0] => 0
[1] => 01
[2] => 012
[3] => 0123
[4] => 01234
[5] => 012345
[6] => 0123456
[7] => 01234567
[8] => 012345678
[9] => 0123456789

然而,如果我删除&amp;它返回:

[0] => 0
[1] => 01
[2] => 12
[3] => 23
[4] => 34
[5] => 45
[6] => 56
[7] => 67
[8] => 78
[9] => 89

我需要帮助理解这一点,或者只是找到一个解决方案而不是改变.ini。

2 个答案:

答案 0 :(得分:4)

来自php manual about references

  

注意:a上没有参考标记   函数调用 - 仅在函数上   定义。功能定义   单独就足以正确传递   参考的论点。截至PHP   5.3.0,你会收到一条警告说“通过参考传递通话”是   使用&amp;时弃用在   FOO(安培; $ A);

这意味着你不能告诉参数是一个参考。只有函数定义才能执行此操作。如果你查看array_walk manual page,你会发现只有第一个参数是引用,而最后一个参数不能。

所以最后,你想要的是弃用了。你可以

  • 更改ini(您不想要)
  • 降级你的php版本
  • 通过将错误级别设置得较低来删除警告。
  • 编写自己的array_walk函数,该函数将引用作为第三个参数

答案 1 :(得分:2)

你在这里滥用array_walk - 你的回调函数实际上没有返回新值。 array_walk旨在使用目标数组中的一个且仅有一个值,并且无法通过引用处理任何内容。

您可以使用简单的for循环来实现您正在寻找的效果:

// Set up the array.
    $array = array();
    for($i = 0; $i < 10; $i++)
        $array[$i] = $i;
// Process it, starting at the second element
    for($i = 1; $i < count($array); $i++)
        $array[$i] = $array[$i - 1] . $array[$i];
    print_r($array);