Rumah >pembangunan bahagian belakang >tutorial php >Iterator tak segerak dalam PHP8.0

Iterator tak segerak dalam PHP8.0

王林
王林asal
2023-05-14 13:00:261055semak imbas

Dalam versi PHP8.0, ciri baharu - lelaran tak segerak telah ditambah. Kemunculan ciri ini menjadikan PHP lebih fleksibel dan berkuasa dalam pengaturcaraan tak segerak. Artikel ini akan memperkenalkan secara terperinci definisi, fungsi, penggunaan dan contoh iterator tak segerak dalam PHP8.0.

1. Apakah itu lelaran tak segerak?

Kebanyakan orang sudah biasa dengan konsep iterator PHP (Iterator), yang boleh membantu kami merentasi beberapa struktur data khas (seperti tatasusunan, koleksi, dll.) tanpa menulis gelung secara manual. Dalam PHP8.0, terdapat konsep baharu lelaran tak segerak, yang ditakrifkan sebagai lintasan tak segerak beberapa struktur data khas.

Ringkasnya, iterator tak segerak boleh membantu kami merentasi data secara tak segerak, menjadikan kod lebih fleksibel dan cekap.

2. Apakah peranan lelaran tak segerak?

Iterator tradisional perlu menunggu proses traversal selesai sebelum mengembalikan keputusan, manakala iterator tak segerak membenarkan kami memproses data secara tak segerak semasa proses traversal. Ini berguna untuk aplikasi yang sensitif masa atau mengendalikan sejumlah besar data.

Contohnya, apabila memproses pertanyaan pangkalan data yang besar atau mendapatkan sejumlah besar data daripada API, iterator tak segerak boleh membantu kami memuatkan dan memproses data atas permintaan dalam cara tak segerak, mengurangkan masa menunggu dan mempercepatkan pemprosesan aplikasi.

3. Cara menggunakan iterator tak segerak

Untuk menggunakan kelas iterator tak segerak, anda perlu melaksanakan kaedah panggil balik getAsyncIterator() dan fetchAsync() . Antaranya, kaedah getAsyncIterator() mengembalikan objek lelaran tak segerak yang melaksanakan antara muka AsyncIteratorInterface dan kaedah fetchAsync() mengembalikan objek yang boleh ditunggu untuk mendapatkan elemen secara tak segerak.

Kod berikut menunjukkan cara untuk melaksanakan lelaran tak segerak:

class MyAsyncIterator implements AsyncIteratorInterface
{
    public function getAsyncIterator(): AsyncIteratorInterface
    {
        return $this;
    }
 
    public async function fetchAsync(): Promise
    {
        return await $this->getNextDataFromSource();
    }
 
    private async function getNextDataFromSource()
    {
        //异步加载数据
        return 'next data';
    }
}

Dalam contoh di atas, kelas MyAsyncIterator melaksanakan antara muka AsyncIteratorInterface dan mentakrifkan getAsyncIterator() dan fetchAsync() kaedah Digunakan untuk melintasi data secara tidak segerak dan mendapatkan elemen.

4. Contoh iterator tak segerak

Untuk lebih memahami cara iterator tak segerak berfungsi, kita boleh lihat daripada contoh.

class MyAsyncIterable implements AsyncIteratorInterface {
    private int $max;
    
    public function __construct(int $max) {
        $this->max = $max;
    }
    
    public function getAsyncIterator(): AsyncIteratorInterface {
        return $this;
    }
    
    public async function fetchAsync(): Promise {
        if ($this->max <= 0) {
            return null;
        }
        
        $toDelay = rand(1, 3);
        $this->max -= $toDelay;
        await new ReactPromiseTimerInterval($toDelay * 1000);
        return $this->max;
    }
}
 
class App {
    public static async function main(Array $args) {
        $asyncIterable = new MyAsyncIterable(10);
        foreach ($asyncIterable as $number) {
            echo "Delay: $number 
";
        }
    }
}
 
App::main($argv)->done();

Dalam contoh di atas, kami mencipta kelas MyAsyncIterable untuk mengulangi data secara tidak segerak dan menggunakan gelung foreach dalam kelas App untuk mencetak elemen tatasusunan secara tidak segerak. Semasa pelaksanaan, kami membiarkan program menjana 10 nombor rawak, setiap satu dengan saiz yang berbeza, dan secara rawak memilih masa (1-3 saat) daripadanya untuk mensimulasikan pemuatan data tak segerak.

Hasil pelaksanaan:

Delay: 7 
Delay: 5 
Delay: 2 
Delay: -1 

Semasa proses traversal, apabila kaedah fetchAsync mengembalikan nilai null, ini bermakna traversal telah selesai.

5. Kesimpulan

Pengaturcaraan tak segerak menjadi semakin popular Selain gaya kod tak segerak, iterator tak segerak memberikan fleksibiliti yang lebih baik untuk pengaturcaraan tak segerak dalam PHP. Walaupun ciri ini mungkin tidak diperlukan terutamanya untuk kebanyakan aplikasi, ia boleh menjadi kritikal untuk aplikasi yang sensitif kepada masa tindak balas dan mengendalikan sejumlah besar data.

Atas ialah kandungan terperinci Iterator tak segerak dalam PHP8.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn