【问题标题】:Call-time pass-by-reference warning调用时传递引用警告
【发布时间】:2011-07-07 20:39:58
【问题描述】:
    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 警告:调用时间 引用传递已被弃用 - 按值传递的参数;如果您想通过引用传递它, 修改声明 数组步行()。如果你想 启用调用时传递引用, 你可以设置 allow_call_time_pass_reference 为 true 在您的 INI 文件中。然而,未来 版本可能不支持这个 更长。

如果我在对 array_walk 的调用中删除 &$array 中的 &,此函数将不会返回此正确结果。在第一种情况下,它在哪里起作用,它返回这个结果:

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

而如果我删除 & 它返回:

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

我需要帮助来理解这一点,或者只是为了找到除更改 .ini 之外的解决方案。

【问题讨论】:

    标签: php


    【解决方案1】:

    来自php manual about references

    注意:上没有参考符号 函数调用 - 仅在函数上 定义。函数定义 仅此一项就足以正确通过 通过引用论证。从 PHP 开始 5.3.0,你会得到一个警告说“call-time pass-by-reference”是 使用 & in 时已弃用 foo(&$a);.

    这意味着你不能告诉一个参数是一个引用。只有函数定义才能做到这一点。如果您查看array_walk manual page,您会发现只有第一个参数是引用,而最后一个参数不能。

    所以最后,你想要的东西被弃用了。你可以

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 不要在循环声明中使用 count() ! Count() 相对昂贵,并且每次循环都会执行,因此速度很慢。首先将计数存储到变量中,然后使用它。
      • 是的,我写的时候很懒。 :)
      猜你喜欢
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2014-03-31
      相关资源
      最近更新 更多