recherche

Maison  >  Questions et réponses  >  le corps du texte

Comment mettre à jour le code qui utilise la fonction obsolète each()

<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粉883223328P粉883223328449 Il y a quelques jours660

répondre à tous(2)je répondrai

  • P粉463418483

    P粉4634184832023-08-23 09:19:01

    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.

    répondre
    0
  • P粉982881583

    P粉9828815832023-08-23 00:06:26

    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);
      }

    répondre
    0
  • Annulerrépondre