A PHP-generátor, nemzeti programozás
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!