A PHP-generátor, nemzeti programozás

A PHP-generátor, nemzeti programozás
Annak ellenére, hogy php-generátorok kaphatók php 5.5.0, még mindig alig használt. Sőt, a legtöbb fejlesztő tudom, megérteni, hogyan működik a generátor. de nem látja, akkor lehet hasznos, a valós életben.

Igen, generátorok határozottan jól néz ki, de tudja. Nem tudom, hol lehet hasznos a számomra, kivéve a számítás a Fibonacci-sorozat.

És ezek nem baj, mert még példákat php -dokumentatsii túl egyszerű. Csak magyarázni, hogyan lehet hatékonyan végrehajtani egy sor vagy végighaladni a fájl sor.

De még ezt az egyszerű példát, meg tudjuk érteni a legfontosabb előnyeit használja generátorok. ők csak egyszerűsíteni iterátorokat.

A generátor lehetővé teszi, hogy írjon kódot használó foreach végiglépkedhetünk több adatot, anélkül, hogy a memóriát a tömb.

Vezetése ezt a tényt szem előtt tartva, megpróbálom megmagyarázni, hogy miért a generátorok nagy segített megoldani a problémát, amit dolgozott a cégnél.

Először is, egy kis háttér

A legtöbb kód példát fogok hivatkozni erre a meta $ könyveket.

Iteráció egy nagy adathalmazt

A hagyomány szerint, azt kell írni valamit, mint például:

A probléma könnyen belátható: több könyv, többet kell a memória $ filteredEbooks.

Egy megoldás -, hogy hozzon létre egy bejáró, ami iterált $ könyveket és visszaút megfelelő. De ehhez szükségünk lenne egy új osztályt, továbbá iterátorokat realiziruyutsya kicsit unalmas. Szerencsére, php 5.5.0, fel tudjuk használni a generátor!

Igen, refactoring getEbooksEligibleToWebReader módszer használata a generátor egyszerű: cserélje ki az értékközvetítés, hogy a változó $ filteredEbooks tervezés hozammal.

Feltételezve, hogy a $ array könyveket nem könyveket. és bejáró, vagy a generátor (még jobb!), memória-felhasználás ezúttal állandó, nem számít, hány könyvet szeretne visszatérni, és biztosak vagyunk benne, hogy a könyv fogja keresni csak valóban szükséges.

Bónusz: RulerZ belsejében a generátor használják. hogy mi lehet újraírni módszer és marad az azonos optimalizálása memóriafoglalási.

Összesítése több adatforrás

Most tekintsük az átvétel időpontjában a $ könyveket. Nem mondom, de ezek valójában különböző forrásokból származhat: relációs adatbázis és Elasticsearch.

Mi lehet írni egy egyszerű módszert összesítése két forrásból:

De még egyszer, a memória mennyiségét elfogyasztott ha ez a megközelítés nagyon függ a könyvek száma az adatbázisban tárolt és Elasticsearch.

Mi lehet kezdeni használni a generátor és vissza az eredményt:

Így, persze, jobb, de még mindig van egy probléma: a metódus getBooks túl sok munka! Meg kell szétválasztani a két felelősség (olvasd el az adatokat az adatbázisból, és a kihívás Elasticsearch) a két módszer:

Lehet, hogy észrevette a használata a kitermelés az üzemeltető (kapható php 7,0), amely lehetővé teszi, hogy átruházza a használatát generátorok. Ideális például az összesítés több adatforrást használnak generátorok.

hozam az üzemeltető működik minden Traversable tárgy, úgy, hogy a tömbök és a iterátorok is használható ez az operátor.

Ezzel a szerkezettel, akkor összevonja több adatforrás, egy pár sornyi kódot:

Kifinomult lusta (on-demand) hidratálása adatbázisrekordok

Egy másik kiviteli alakban generátorok használni - megvalósítása lusta hidratálás, amely képes feldolgozni kommunikációt.

Azt kellett importálni több százezer megrendeléseket régi adatbázis rendszer, minden megrendelésnél több olyan terméket.

A jelenléte megrendelések és a „rend példány” volt a feltétele, hogy mit kell tennünk. Írtam egy módszert, amely visszaadja sgidrirovanye megrendelések és ugyanakkor túlságosan lassú vagy torkos.

Az ötlet egy kicsit naiv: sdzhoynit megrendelések példány, csoportos megrendelések és a rend példány a sorozatban.

Generátor felhasználásával. Tudtam, hogy végre olyan módszert, amely rendeléseket kap az adatbázisból, és hozzáadja a megfelelő sorrendben terméket. Mindez fogyaszt stabil memória mennyiségét. Generátor megszabadulni a szükségesség, hogy az összes megrendelések és azok elemei a jelenlegi rend - ez minden, amit kell sagregirovat adatokat.

Utánzás aszinkron feladatok

Végül, de nem utolsósorban: generátorok is fel lehet használni, hogy szimulálja az aszinkron feladatokat. Miközben írtam ezt a felülvizsgálatot, rábukkantam egy bejegyzést @nikita_ppv az azonos tárgyú, és mióta először rájött a generátorok php. Én csak hagyjuk egy linket posztjáról.

Gyorsan kifejti, hogy az ilyen generátor (részletesen) hogyan részesülhetnek a tény, hogy letört és küldjön / fogadjon adatokat, hogy végre korutinokat, és még multitasking.

Összegezve

  • . egyszerűsített iterátorok;
  • . visszatérhet korlátlan mennyiségű adat további memória-felhasználás;
  • . Ezeket össze lehet vonni keresztül felhatalmazás generátorok;
  • . Ezeket fel lehet használni végrehajtása multitasking;
  • . csak szórakozás!

Kapcsolódó cikkek