Zadejte hledaný výraz...

vestavěné PHP třídy – Iterator

Václav Mach
verified
rating uzivatele
(13 hodnocení)
23. 8. 2011 14:13:35
V php se vyrojila spousta užitečných vestavěných tříd nebo interface, tak proč je šířeji nepoužívat. Např. bych chtěl místo svého starého iterátoru používat interface Iterator. Jenže jsem z toho paf.
Je to přece pouhé interface. Ale pokud jej zavolám ve foreach, jsou implementované metody postupně volány v určitém pořadí, které navíc závisí na tom zda je to první nebo opakované volání. Dokumentaci objasňující jak to funguje jsem nenašel, jen pořadí volání metod získané jinými uživateli systémem pokus:omyl.
1. Before the first iteration of the loop, Iterator::rewind() is called.
2. Before each iteration of the loop, Iterator::valid() is called.
3a. It Iterator::valid() returns false, the loop is terminated.
3b. If Iterator::valid() returns true, Iterator::current() and
Iterator::key() are called.
4. The loop body is evaluated.
5. After each iteration of the loop, Iterator::next() is called and we repeat from step 2 above.
Tuší někdo jak to funguje? Kde je mechanismus určující pořadí volaných metod?
Je někde nějaká skutečná dokumentace? Nechci mít v kodu černé skřínky žijící vlastním nepředvídatelným životem.
Díky
23. 8. 2011 14:13:35
https://webtrh.cz/diskuse/vestavene-php-tridy-iterator/#reply669744
V dokumentaci to je dobře popsané, včetně pořadí volání, ne?
http://cz2.php.net/manual/en/class.iterator.php
volá interní metody takto
// start of loop
string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
// first loop
string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
// second loop
string(16) "myIterator::next"
string(17) "myIterator::valid"
// end of loop
23. 8. 2011 14:51:30
https://webtrh.cz/diskuse/vestavene-php-tridy-iterator/#reply669743
Václav Mach
verified
rating uzivatele
(13 hodnocení)
23. 8. 2011 16:50:58
díky to jsem viděl ale stejně ten koncept nechápu
když si přidám do projektu interface které si napíšu sám tak je to jen interface které nutí objekty implementovat metody další funkcionalitu nepřidá
když ale napíšu "class myIterator implements Iterator" tak najednou získám nějaké magické chování které se projevuje určitým pořadím volání metod (a kdoví čím ještě?)
prostě se bojím si přidávat do projektu nějaký magický kod, aniž bych byl schopen zjistit co a jak přesně dělá
23. 8. 2011 16:50:58
https://webtrh.cz/diskuse/vestavene-php-tridy-iterator/#reply669742
Je to interface, takže musíte implementovat metody sám. Objekt pak můžete použít např. ve foreach(), bude se tedy dát procházet stejně jako pole.
Jak bude iterovat uvnitř - tj. přes jaké proměnné, v jakém pořadí atd. záleží právě na vaší implementaci.
V dokumentaci a v příkladu nahoře vidíte, v jakém pořadí se metody Iteratoru volají při průchodem pomocí foreach.
23. 8. 2011 16:55:16
https://webtrh.cz/diskuse/vestavene-php-tridy-iterator/#reply669741
Pro odpověď se přihlašte.
Přihlásit