In realtà il mio obiettivo iniziale per questo post era un'introduzione alla Standard PHP Library ma ho scoperto che Gabriele mi ha anticipato di un anno, scrivendo anche un articolo su Php.Html.it.
Poco male mi sono detto, cambierà focus e mi concentrerà su uno degli aspetti che più mi piace della SPL, ovvero l'interfaccia Iterator.
Iterator consente di accedere ad una collezione di elementi con le funzioni classiche di un array, indipendentemente dal tipo e dalle caratteristiche di questi elementi.
Passiamo subito agli esempi. Vi ricordate come si legge la lista dei file in PHP? Per rinfrescarvi la memoria ecco un breve esempio
if ($handle = opendir('/folder/path')) {
while (($file = readdir($handle)) !== false) {
if ($file != "." && $file != "..") {
print "$file <br>";
}
}
closedir($handle);
}
Se dovessimo "raccontare" codice diremmo qualcosa del tipo '/folder/path':
- Crea un riferimento ad una risorsa che rappresenta la directory
- Se il riferimento è valido prosegui
- Tenta di leggere il primo valore associato al riferimento e se si tratta di un file procedi
- Se il valore del file non è un puntamento alla cartella padre o se stessa procedi
- Stampa il file
- Esegui fino a che esistono risorse all'interno della cartella
Ma quanto è prolisso questo codice... non sarebbe bello poter dire qualcosa tipo:
- Carica la directory '/folder/path'
- Per ogni file nella directory stampa il nome
Bello vero? Traduciamolo in PHP con l'ausilio della classe DirectoryIterator.
$dir = new DirectoryIterator( '/folder/path/');
foreach($dir as $file) {
print $file->getFilename();
}
Cavolo, ma allora si può fare davvero... e funziona!
Ebbene sì, grazie alla classe DirectoryIterator è possibile accedere in modo rapido e semplificato ai file di una directory ed alle loro caratteristiche.
Oltre al metodo ->getFilename()
esiste una lunga lista di metodi che restituiscono le diverse proprietà del file.
Ad esempio getSize()
restituisce la dimensione in byte mentre isWritable()
indica se il file è scrivibile dall'account in uso.
$dir = new DirectoryIterator( '/folder/path/');
foreach($dir as $file) {
if (!$file->isDot() && !$file->isDir()) {
print "<p>File name: " . $file->getFilename();
print "<br>File size: " . number_format(($file->getSize()/1024), 2) . " Kb </p>";
}
}
Sebbene questa classe sia parte della dotazione standard di PHP 5 ho notato pochissimi sistemi farne uso, così come pochissime sono le implementazioni dell'interfaccia Iterator disponibili in rete. Per mio uso personale ho realizzato due classi molto utili, chiamate FileIterator e CsvIterator, per scorrere rispettivamente il contenuto di file di testo e file CSV.
Voi l'avete mai utilizzata? La conoscevate?