Cara mengemas kini kod yang menggunakan fungsi each() yang telah ditamatkan
P粉883223328
P粉883223328 2023-08-22 11:44:11
0
2
595
<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粉883223328
P粉883223328

membalas semua(2)
P粉463418483

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.

P粉982881583
  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);
    }
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!