Comment mettre à jour le code qui utilise la fonction obsolète each()
P粉883223328
P粉883223328 2023-08-22 11:44:11
0
2
689
<p>Avec PHP 7.2, la fonction <code>each</code> est obsolète. La documentation mentionne : </p> <blockquote> <p><strong>Avertissement</strong> Depuis PHP 7.2.0, cette fonction est obsolète. Le recours à cette fonction est fortement déconseillé. </p> </blockquote> <p>Comment mettre à jour mon code pour éviter de l'utiliser ? Voici quelques exemples : </p> <ol> <li> <pre class="brush:php;toolbar:false;">$ar = $o->me; réinitialiser($ar); list($typ, $val) = each($ar);</pre> ≪/li> <li> <pre class="brush:php;toolbar:false;">$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $attendu = chacun($out);</pre> ≪/li> <li> <pre class="brush:php;toolbar:false;">for(reset($broken);$kv = each($broken);) {...}</pre> ≪/li> <li> <pre class="brush:php;toolbar:false;">list(, $this->result) = each($this->cache_data);</pre> ≪/li> <li> <pre class="brush:php;toolbar:false;">// itérer jusqu'à la fin d'un tableau ou une limite > $je = 0 ; réinitialiser ($ tableau); while( (list($id, $item) = each($array)) || $i < 30 ) { //code $i++; }</pré> ≪/li> </ol> <p>Lorsque j'exécute le code sur PHP 7.2, j'obtiens l'erreur suivante : </p> <blockquote> <p>Obsolète : la fonction each() est obsolète. Ce message sera ignoré lors des prochains appels</p> </blockquote><p><br /></p>
P粉883223328
P粉883223328

répondre à tous(2)
P粉463418483

2019+mise à niveau instantanéeeach()

Il existe en fait de nombreux cas où each() peut être remplacé, c'est pourquoi il y a tant de réponses différentes votées positivement à cette question.

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

Aussi :

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

Vous pouvez remplacer manuellement un par un. Mais n'y a-t-il pas une meilleure solution ?

J'aide dans des projets de migration et j'ai plus de 150 cas comme celui-ci. Je suis paresseux, alors j'ai créé un outil appelé Rector qui convertit le code de la manière ci-dessus (il y a plus de cas, mais je ne veux pas spammer la réponse).

Il fait partie de la collection PHP_72.


4 étapes pour mettre à jour votre code

1.Installation

composer require rector/rector --dev

2. Créez un rector.phpfichier de configuration

vendor/bin/rector init

3. Ajouter une PHP_72Collection

<?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. Exécutez-le sur votre code

vendor/bin/rector process src --set php72

J'espère que cela vous aidera dans votre migration.


S'il y a des erreurs ou des exceptions, c'est ce que le Recteur a manqué. Créez un problème afin que nous puissions le résoudre et le faire fonctionner dans tous les cas possibles.

P粉982881583
  1. Pour vos deux premiers exemples de cas, vous pouvez utiliser key()current() pour attribuer les valeurs dont vous avez besoin.

    $ar = $o->me;   // 重置不是必需的,因为你刚刚创建了数组
    $typ = key($ar);
    $val = current($ar);
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];

    Dans ces cas, vous pouvez utiliser next() pour avancer le curseur par la suite, mais cela peut ne pas être nécessaire si le reste de votre code n'en dépend pas.

  3. Pour le troisième cas, je vous suggère d'utiliser simplement un foreach() 循环,并在循环内部分配 $kv.

    foreach ($broken as $k => $v) {
         $kv = [$k, $v];
    }
  4. Pour le quatrième cas, la clé semble être ignorée dans list() afin que vous puissiez attribuer la valeur actuelle.

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

    Comme dans les deux premiers cas, selon la façon dont le reste de votre code interagit avec $this->cache_data, vous devrez peut-être utiliser $this->cache_data 交互,可能需要使用 next() pour faire avancer le curseur.

  5. Le cinquième cas peut être remplacé par for()boucle.

    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // 代码
        next($array);
    }
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal