Översikt över generatorer

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

Generatorer i PHP (PHP 5 >= 5.5.0, PHP 7, PHP 8)

Generatorer erbjuder ett enkelt sätt att implementera enkla iteratorer utan den overhead eller komplexitet som det innebär att implementera en klass som implementerar `Iterator`-gränssnittet.

En generator gör det möjligt att skriva kod som använder `foreach` för att iterera över en uppsättning data utan att behöva skapa en array i minnet, vilket kan leda till att minnesgränsen överskrids eller att det krävs en betydande mängd processorkraft för att generera. Istället kan du skriva en generatorfunktion, som fungerar på samma sätt som en vanlig funktion, med undantaget att en generator kan använda `yield` så många gånger som behövs för att tillhandahålla värden att iterera över.

Ett enkelt exempel på detta är att implementera om `range()`-funktionen som en generator. Den vanliga `range()`-funktionen måste skapa en array med alla värden och returnera den, vilket kan resultera i stora arrayer: till exempel kommer ett anrop av `range(0, 1000000)` att använda mer än 100 MB minne.

Som ett alternativ kan vi implementera en `xrange()`-generator, som endast behöver tillräckligt med minne för att skapa ett `Iterator`-objekt och spåra generatorns aktuella tillstånd internt, vilket visar sig vara mindre än 1 kilobyte.

Exempel #1 Implementering av `range()` som en generator

<?php
function xrange($start, $limit, $step = 1) {
    if ($start <= $limit) {
        if ($step <= 0) {
            throw new LogicException('Steget måste vara positivt');
        }

        for ($i = $start; $i <= $limit; $i += $step) {
            yield $i;
        }
    } else {
        if ($step >= 0) {
            throw new LogicException('Steget måste vara negativt');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}

/*
 * Observera att både range() och xrange() ger samma
 * resultat nedan.
 */

echo 'Ensiffriga udda tal från range():  ';
foreach (range(1, 9, 2) as $number) {
    echo "$number ";
}
echo "\n";

echo 'Ensiffriga udda tal från xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}
?>

Ovanstående exempel kommer att ge följande output:

Ensiffriga udda tal från range():  1 3 5 7 9
Ensiffriga udda tal från xrange(): 1 3 5 7 9

Generatorobjekt

När en generatorfunktion anropas returneras ett nytt objekt av den interna `Generator`-klassen. Detta objekt implementerar `Iterator`-gränssnittet på samma sätt som ett framåtgående iterator-objekt skulle göra, och tillhandahåller metoder som kan anropas för att manipulera generatorns tillstånd, inklusive att skicka och ta emot värden från den.

Sidslut

Orginalhemsidan på Engelska : https://www.php.net/manual/en/language.fibers.php
PHP
Språkreferens
Språkreferens#Generatorer


Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/