Zadejte hledaný výraz...

[N] PHP bude mít generátory

Petr Soukup
verified
rating uzivatele
(5 hodnocení)
5. 9. 2012 21:26:16
Načíst něco velkého do pole a pak to vrátit je obvykle cesta do pekel právě kvůli spotřebě paměti a generátor to velmi primitivně řeší.
5. 9. 2012 21:26:16
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804582
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
5. 9. 2012 21:32:58
Napsal Souki;841004
Pokud budeme mít dvě funkce, kde jedna přečte 1000 řádků souboru a vrátí je jako pole a druhá bude generátor, který je vrací postupně, tak ta první zabere v paměti (zhruba) 1000x víc místa.
Když volám fci $lines = getLinesFromFile($fileName); , tak mi yield vrátí obrazně 1000x "return", ale to se přeci také někam musí uložit, když je to pak dostupné jako pole resp. to pole je dostupné až potom co jsem volal fci getLinesFromFile, tedy v cyklu
foreach ($lines as $line) {
/* přes foreach se prochází postupně souborem a zpracovávají se řádky po jednom*/
}
už se k funkci nepřistupuje.
---------- Příspěvek doplněn 05.09.2012 v 21:34 ----------
Mám to chápat, že je to jakási forma pointeru?
5. 9. 2012 21:32:58
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804581
Petr Soukup
verified
rating uzivatele
(5 hodnocení)
5. 9. 2012 21:49:24
Generátor nefunguje tak, že proběhne celá funkce, uloží se výsledek a pak to postupně vrací. On to vrací v průběhu té funkce. Takže se posouvá v souboru (nebo v čemkoliv jiném) a vrací vždycky konkrétní řádek. Předchozí nikam neukládá.
5. 9. 2012 21:49:24
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804580
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
5. 9. 2012 22:17:58
Mohl bych to chápat tak, že fce getLinesFromFile vrátí pole, ale v něm není plný textový obsah jednotlivých řádků souboru, ale spíš jakýsi virtuální návod pro systém, co má provést, aby získal obsah? Např. druhý řádek souboru obsahuje text a $lines neobsahuje text uložený v paměti, ale instrukci "sosni si do souboru XY na druhý řádek a zobraz text". Pro nás jako uživatele se to však vždy chová běžné pole s textem, ale z hlediska počítače je v běžném array text v yield array instrukce, kde získat text. Ano?
5. 9. 2012 22:17:58
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804579
Petr Soukup
verified
rating uzivatele
(5 hodnocení)
5. 9. 2012 22:21:24
Chová se to, jako by vrátil podle, ale nevrátí ho. Nejde třeba ani jít na předchozí prvek.
5. 9. 2012 22:21:24
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804578
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
5. 9. 2012 22:25:14
Uf. Asi to necháme, až to bude implementováno ;o) Díky za čas.
5. 9. 2012 22:25:14
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804577
Petr Soukup
verified
rating uzivatele
(5 hodnocení)
5. 9. 2012 22:38:26
Ono je to právě dost magické a nechová se to podle běžných očekávání :)
5. 9. 2012 22:38:26
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804576
Petr Zachrdla
verified
rating uzivatele
(1 hodnocení)
5. 9. 2012 22:46:34
To je jak z Pátého elementu - tato věc se nedá identifikovat, protože si sama nepřeje být identifikována ;o))
5. 9. 2012 22:46:34
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804575
Ondřej Švec
verified
rating uzivatele
6. 9. 2012 07:36:32
Napsal Bedříšek;840996
ok. díky. tak to zatím chápu stejně, ale to se nijak neliší od
$temp[] = $line;
...
return $temp;
protože ta informace zabere v paměti stejně místa, lze s ní stejně manipulovat (array)
Souki to řekl trochu nepřesně a hned ztratilo význam. Jde o to, že když do té funkce dáš yield, tak se ta funkce na tom místě přeruší. Je to něco jako kdybys napsat return $line, jenomže si ta funkce pamatuje, kde skončila a když ji zavoláš znovu, tak pokračuje jako by se nic nestalo.
Nejlíp to jde vidět tady na tom příkladě z dokumentace:
function gen() {
echo 'start';
yield 'middle';
echo 'end';
}
// Initial call does not output anything
$gen = gen();
// Call to current() resumes the generator, thus "start" is echo'd.
// Then the yield expression is hit and the string "middle" is returned
// as the result of current() and then echo'd.
echo $gen->current();
// Execution of the generator is resumed again, thus echoing "end"
$gen->next();
A zpátky k vašemu příkladu se čtením souboru:
Když se funkce zavolá poprvé, tak to dojde od začátku až k cyklu while a jednou ho provede (máme přečtený první řádek):
while (false !== $line = fgets($fileHandle)) {
yield $line;
}
Když se zavolá podruhé, tak se přečte druhý řádek. Atd. atd.
Když se zavolá naposled (nevyhovuje podmínka cyklu), tak se vlastně přeskočí yield a funkce doběhne do konce (zavře soubor a skončí).
6. 9. 2012 07:36:32
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804574
Jan Matoušek
verified
rating uzivatele
(12 hodnocení)
17. 9. 2012 10:49:39
Generátory jsou pěkně k pochopení v přednášce od Jakuba Vrány:
http://sprednasky.cz/zkusenosti-z-vyvoje-facebooku/
od 8:15
17. 9. 2012 10:49:39
https://webtrh.cz/diskuse/n-php-bude-mit-generatory/strana/2#reply804573
Pro odpověď se přihlašte.
Přihlásit