cari

Rumah  >  Soal Jawab  >  teks badan

Cara mengemas kini kod yang menggunakan fungsi each() yang telah ditamatkan

<p>Dengan PHP 7.2, fungsi <kod>setiap</code> Dokumentasi menyebut: </p> <blockquote> <p><strong>Amaran</strong> Mulai PHP 7.2.0, fungsi ini telah ditamatkan. Pergantungan pada fungsi ini amat tidak digalakkan. </p> </blockquote> <p>Bagaimanakah saya mengemas kini kod saya untuk mengelak daripada menggunakannya? Berikut ialah beberapa contoh: </p> <ol> <li> <pre class="brush:php;toolbar:false;">$ar = $o->me; set semula($ar); list($typ, $val) = each($ar);</pre> </li> <li> <pre class="brush:php;toolbar:false;">$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $expected = each($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;">// berulang ke penghujung tatasusunan atau had > $i = 0; reset($array); while((list($id, $item) = each($array)) || $i < 30 ) { // kod $i++; }</pre> </li> </ol> <p>Apabila saya melaksanakan kod pada PHP 7.2, saya mendapat ralat berikut: </p> <blockquote> <p>Ditamatkan: Fungsi each() telah ditamatkan. Mesej ini akan diabaikan semasa panggilan lanjut</p> </blockquote><p><br /></p>
P粉883223328P粉883223328458 hari yang lalu669

membalas semua(2)saya akan balas

  • P粉463418483

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

    2019+naik taraf segeraeach()

    Sebenarnya terdapat banyak kes di mana each() boleh digantikan, itulah sebabnya terdapat begitu banyak jawapan undian tinggi yang berbeza dalam soalan ini.

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

    Juga:

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

    Anda boleh menggantikan secara manual satu per satu. Tetapi tidakkah ada cara yang lebih baik?

    Saya membantu dengan projek migrasi dan mempunyai lebih daripada 150 kes seperti ini. Saya malas, jadi saya membuat alat yang dipanggil Rektor yang menukar kod ke cara di atas (ada lagi kes, tetapi saya tidak mahu spam jawapannya).

    Ia adalah sebahagian daripada koleksi PHP_72.


    4 langkah untuk meningkatkan kod anda

    1. Pemasangan

    composer require rector/rector --dev

    2. Cipta rector.phpfail konfigurasi

    vendor/bin/rector init

    3. Tambah PHP_72Koleksi

    <?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. Jalankan pada kod anda

    vendor/bin/rector process src --set php72

    Semoga ia membantu dengan penghijrahan anda.


    Jika terdapat sebarang kesilapan atau pengecualian, itu yang Rektor terlepas. Buat isu supaya kami boleh membetulkannya dan menjadikannya berfungsi untuk semua kes yang mungkin.

    balas
    0
  • P粉982881583

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

    1. Untuk dua contoh kes pertama anda, anda boleh menggunakan key()current() untuk menetapkan nilai yang anda perlukan.

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

      Dalam kes ini, anda boleh menggunakan next() untuk memajukan kursor selepas itu, tetapi ini mungkin tidak diperlukan jika selebihnya kod anda tidak bergantung padanya.

    3. Untuk kes ketiga, saya cadangkan anda hanya menggunakan foreach() 循环,并在循环内部分配 $kv.

      foreach ($broken as $k => $v) {
           $kv = [$k, $v];
      }
    4. Untuk kes keempat, kunci nampaknya diabaikan dalam list() supaya anda boleh menetapkan nilai semasa.

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

      Seperti dua kes pertama, bergantung pada cara selebihnya kod anda berinteraksi dengan $this->cache_data, anda mungkin perlu menggunakan $this->cache_data 交互,可能需要使用 next() untuk memajukan kursor.

    5. Kes kelima boleh digantikan dengan for() gelung.

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

    balas
    0
  • Batalbalas