So aktualisieren Sie Code, der die veraltete Funktion every() verwendet
P粉883223328
P粉883223328 2023-08-22 11:44:11
0
2
691
<p>Mit PHP 7.2 ist die Funktion <code>each</code> veraltet. In der Dokumentation wird Folgendes erwähnt: </p> <blockquote> <p><strong>Warnung</strong> Ab PHP 7.2.0 ist diese Funktion veraltet. Es wird dringend davon abgeraten, sich auf diese Funktion zu verlassen. </p> </blockquote> <p>Wie aktualisiere ich meinen Code, um seine Verwendung zu vermeiden? Hier einige Beispiele: </p> <ol> <li> <pre class="brush:php;toolbar:false;">$ar = $o->me; zurücksetzen($ar); list($typ, $val) = every($ar);</pre> </li> <li> <pre class="brush:php;toolbar:false;">$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $expected = every($out);</pre> </li> <li> <pre class="brush:php;toolbar:false;">for(reset($broken);$kv = every($broken);) {...}</pre> </li> <li> <pre class="brush:php;toolbar:false;">list(, $this->result) = every($this->cache_data);</pre> </li> <li> <pre class="brush:php;toolbar:false;">// iteriert bis zum Ende eines Arrays oder einer Begrenzung der Länge des Arrays $i = 0; zurücksetzen($array); while( (list($id, $item) = every($array)) || $i < 30 ) { // Code $i++; }</pre> </li> </ol> <p>Wenn ich den Code unter PHP 7.2 ausführe, erhalte ich die folgende Fehlermeldung: </p> <blockquote> <p>Veraltet: Die Funktion every() ist veraltet. Diese Nachricht wird bei weiteren Aufrufen ignoriert</p> </blockquote><p><br /></p>
P粉883223328
P粉883223328

Antworte allen(2)
P粉463418483

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错过的情况。创建一个问题,这样我们就可以修复它,并使其适用于所有可能的情况。

P粉982881583
  1. 对于你的前两个示例案例,你可以使用 key()current() 来分配你所需要的值。

    $ar = $o->me;   // 重置不是必需的,因为你刚刚创建了数组
    $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);

    像前两种情况一样,根据你的其余代码如何与 $this->cache_data 交互,可能需要使用 next() 推进游标。

  5. 第五种情况可以用 for() 循环替代。

    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // 代码
        next($array);
    }
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage