Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SPL] Jak korzystać z DirectoryIteratortor?
Forum PHP.pl > Forum > PHP
wdev
Witam,

Odkrywam ostatnio klasy SPL-a, jedne bardziej przydatne, inne zdecydowanie mniej... I tak się zastanawiam - czy warto korzsytać z DirectoryIterator?

Próbowałem go użyć w małym skrypcie: odczytaj folder ze zdjęciami, pobierz wszystkie pliki ze zdjęciami, wykonaj akcję otrzymania tytułu na podstawie nazwy pliku, przekaż link do controllera.

Coś, co było paroma linkami z wykorzystaniem prostej tablicy i paru funkcji sprawdzających, stało się nagle dużo bardziej skomplikowane:
1. Musiałem stworzyć własną klasę extends DirectoryIterator z funkcją pobierania tytułu pliku oraz funkcją usuwania niepotrzebnych fragmentów ścieżki pliku (żeby otrzymać wartość nadającą się do umieszczenia w linku).
2. Użyć FilterIteratora do usunięcia ".", ".." i wszystkich plików niebędących zdjęciami.
3. ...a po tym wszystkim okazało się, że skrypt działa dużo wolniej.

Wobec tego zastanawia mnie, czy ktoś z was korzystał z DirectoryIteratora, w jakich celach i w jaki (mniej więcej) sposób? Czy warto?
wookieb
Nie musiałeś tworzyć własnej klasy masz przecież getBasename() .
Nie musiałes używac filterIterator, wystarczyło w pętli użyć isDot() .
thek
wdev... Cokolwiek obiektowego z reguły jest już na starcie wolniejsze, bo nie masz prostej rzeczy, ale cały pakiet gotowych rzeczy i niesie on z sobą pewien narzut czasowy. Kolejne warstwy abstrakcji zawsze to powodują w mniejszym lub większym stopniu. To jak z oprogramowaniem. Możesz mieć proste i szybkie narzędzie, ale ograniczone, albo wielką kobyłę, która tylko Ci obiadu nie ugotuje, ale przez taki ogrom możliwości jest ociężała. SPL to fajne narzędzie, gdyż zrzuca z programisty konieczność martwienia się o pewne rzeczy, ale za cenę mniejszej wydajności właśnie. Tak więc tam, gdzie nie spodziewasz się dużego obciążenia można stosować SPL gdzie chcesz, ale jeśli Cię obciążą mocniej to wrócisz do prostszych, ale wydajniejszych funkcji zapewne winksmiley.jpg
wdev
Cytat(wookieb @ 15.11.2010, 07:10:52 ) *
Nie musiałeś tworzyć własnej klasy masz przecież getBasename() .
Nie musiałes używac filterIterator, wystarczyło w pętli użyć isDot() .


Niekoniecznie basename, skoro musze wskazac pozycje gdzies wewnatrz drzewa. Z basename co najwyzej moge zrobic konkatenacje z argumentem przekazanym konstruktorowi. Skoro chce odciazyc plik viewera z robienia takich akcji musze to zrobic w obiekcie...

FilterIterator tez mi wyglada na niezbedny - jak inaczej przefiltruje tylko pliki graficzne? Poza tym, skoro odczytanie folderu bede robil obiektowo, a wiekszosc normalnymi petlami, to jaki ma sens w ogole korzystanie z tego obiektu?

Zalozmy:
  1. $dirhandle = opendir($dir);
  2. while (false !== ($file = readdir($dirhandle))){
  3. if ($file != "." && $file != ".." && !is_dir($file) && substr_compare($file, $extension, -3, 3) = 0){
  4. $images[] = $file;
  5. }
  6. }

Co mi da zrobienie:
  1. while($file = new DirectoryIterator($dir));

I uzycie odpowiednich metod? Zaoszczedzilem 1 linijke kodu kosztem wydajnosci. Dlatego mnie zastanawia czy sa jakies profity, o ktorych nie wiem?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.