如何更新使用已弃用的 each() 函数的代码?2019+ 即时升级each()

2022-08-30 07:40:55

在 PHP 7.2 中,已弃用。文档说:each

警告此函数自 PHP 7.2.0 起已弃用。强烈建议不要依赖此功能。

如何更新代码以避免使用它?以下是一些示例:

  1. $ar = $o->me;
    reset($ar);
    list($typ, $val) = each($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = each($out);
    
  3. for(reset($broken);$kv = each($broken);) {...}
    
  4. list(, $this->result) = each($this->cache_data);
    
  5. // iterating to the end of an array or a limit > the length of the array
    $i = 0;
    reset($array);
    while( (list($id, $item) = each($array)) || $i < 30 ) {
        // code
        $i++;
    }
    

当我在 PHP 7.2 上执行代码时,我收到以下错误:

已弃用:each() 函数已弃用。此消息将在进一步调用时被禁止显示


答案 1
  1. 对于前两个示例案例,您可以使用 和 分配所需的值。key()current()

    $ar = $o->me;   // reset isn't necessary, since you just created the array
    $typ = key($ar);
    $val = current($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];
    

    在这些情况下,您可以使用 在之后推进游标,但如果代码的其余部分不依赖于此,则可能没有必要。next()

  3. 对于第三种情况,我建议只使用循环并在循环内部进行分配。foreach()$kv

    foreach ($broken as $k => $v) {
         $kv = [$k, $v];
    }
    
  4. 对于第四种情况,看起来键在 中被忽略,因此您可以分配当前值。list()

    $this->result = current($this->cache_data);
    

    与前两种情况一样,可能需要根据代码的其余部分与 的交互方式提前光标。next()$this->cache_data

  5. 第五个可以用循环代替。for()

    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // code
        next($array);
    }
    

答案 2

2019+ 即时升级each()

实际上有很多案例可以被取代,这就是为什么这个问题有这么多不同的投票答案。each()

-while (list($key, $callback) = each($callbacks)) {
+foreach ($callbacks as $key => $callback) {
     // ...
 }

和:

-while (list($key) = each($callbacks)) {
+foreach (array_keys($callbacks) as $key) {
     // ...
 }

您可以手动逐个替换。但是,难道没有更好的方法吗?

我帮助迁移项目,其中有150多个这样的案例。我很懒,所以我做了一个名为Rector的工具,它以上面的方式转换代码(+还有更多情况,但我不想发送垃圾邮件)。

这是集合的一部分。PHP_72


升级代码的 4 个步骤

1. 安装

composer require rector/rector --dev

2. 创建配置rector.php

vendor/bin/rector init

3. 添加套装PHP_72

<?php

use Rector\Core\Configuration\Option;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    $parameters->set(Option::SETS, [
        Setlist::PHP_72,
    ]);
};

4. 在代码上运行它

vendor/bin/rector process src --set php72

我希望它可以帮助您进行迁移。


如果存在某些错误或异常,则为 Rector 遗漏案例。创建一个问题,以便我们可以修复它并使其适用于每种可能的情况。


推荐