17/05/12

Programmazione a oggetti in PHP





Classi, oggetti, XML e feed RSS collegati tra loro



01 - Classi
Creeremo una classe chiamata RSSFeed che vada a contenere i dati del feed. L'operazione è simile a quella per definire una funzione, con la sola differenza che useremo la parola "class" al posto di "function". Il codice verrà inserito in una coppia di parentesi.
class RSSFeed {
}

02 - Variabili 
La classe RSSFeed è molto semplice, e l'unica variabile che useremo nell'oggetto è un array multidimensionale delle voci del feed RSS, chiamato "items". Questo array viene impostato attraverso una definizione standard di variabile con un ulteriore parola chiave, "public", prima della definizione. Questo significa che la variabile è disponibile esternamente alla definizione della classe. Se vogliamo che la variabile sia accessibile solo dalla classe stessa possiamo usare la parola chiave "private".  Ecco la definizione della variabile.
public $Items=new Array();

03 - Creare una funzione
Ora che disponiamo di una classe e di un array adatto in cui memorizzare le voci del feed RSS, dobbiamo trovare un modo per inserirle. Alla nostra classe viene assegnata una funzione che prende un feed RSS come argomento e ne trasferisce i contenuti nell'arra items. Iniziamo dichiarando la funzione, usando la parola "public", e aggiungendo un nome di variabile tra parentesi così che la variabile sia disponibile all'interno della funzione:
public function addFeed($rss_url) {
}

04 - Lavorare con XML 
I feed RSS sono dei file XML standard e iniziano con un elemento <channel>, all'interno del quale sono presenti numerosi elementi <item>. Ogni elemento <item> contiene altri elementi che ne descrivono i contenuti: <title>, <description> e <pubdate> (cioè la data in cui è stata pubblicata la voce). Per recuperre questi dati da feed, usiamo alcune funzioni XML di PHP. La prima riga apre il file nella variabile $rss_url come un file XML. La seconda riga avvia un ciclo 'foreach' che recupera ciascun elemento<item>, mentre la riga successiva prende i contenuti degli elementi <title>, <link>, <description> e <pubDate> che si trovano nell'elemento <item> e li aggiunge all'arra Items. La cosa importante da notare riguardo a questo codice è l'utilizzo di"$this". Poiché possiamo avere diversi oggetti del feed RSS, non possiamo fare riferimento a essi per nome perché il nome può cambiare. per fare riferimento all'istanza di una classe con cui stiamo lavorando usiamo quindi $this.
$xml=simplexml_load_file($rss_url);
foreach($xml->channel->item as $item) {
         $this.>items[] = array("title"=> $item->title,
                                  "link"=> $item->link,
                                  "description" => $item->description,
                                  "pubDate" => strtotime($item->pubDate)
                                   );

05 - Ordinare le voci
Abbiamo la classe, l'arai al suo interno e una funzione che inserisce in tale array un feed RSS.
Possiamo chiamare questa funzione diverse volte e aggiungere all'arra vari feed RSS, creando contenuti provenienti da varie fonti. Il problema qui è che i feed RSS per essere utili devono essere in ordine di data, e che l'arai Items sarà ordinato secondo la sequenza con cui abbiamo inserito i feed. PHP dispone di numerose funzioni diverse per ordinare gli array, ma sfortunatamente nessuna di esse è adatta a questa situazione: dobbiamo quindi usare "usort", una funzione che ci permette di scrivere il nostro sistema di ordinamento. Aggiungiamo questa riga alla funzione addFeed.
usort($this->Items,array("RSSFeed","arraySortByDate"));

06 - La funzione di ordinamento
"usort" dice a PHP che per ordinare l'arai Items deve usare la funzione arraySortByDate della classe RSSFeed. Siccome stiamo definendo la classe RSSFeed, dobbiamo scrivere la funzione di ordinamento. Questi tipi di funzioni sono semplici: vengono chiamati più e più volte con due argomenti finchè l'intero array viene ordinato. Abbiamo quindi $a e $b e la funzione deve restituire 1 se $b viene per primo e 0 se sono uguali. Tutto ciò che dobbiamo fare è confrontare i due elementi "pubDate" e restituire il valore appropriato.
static function arraySortByDate($a, $b) {
               if($a["pubDate"]>$b["pubDate"]) {
                       return-1;
                } else if ($a["pubDate"] < $b["pubDate"]) {
                        return 1;
                }else {
                      return 0;
              }
    }
?>
}

07 -  Esportare il feed
Inserire le informazioni nell'oggetto è solo l'inizio: dobbiamo trovare il modo di visualizzare nel browser il nuovo contenuto ordinato. Scriveremo quindi un'altra funzione, "exportAsHTML", che scorra l'intero array Items e visualizzi il contenuto in un formato leggibile dal browser. In questo caso useremo le tabelle. Da notare ancora una volta l'uso della variabile "$this" per accedere all'arra Items corretto. Per trasformare il campo pubDate in qualcosa di più leggibile, useremo la funzione "date" di PHP.
public function exportAsHTML() {
            foreach($this->Items as $Item) {
                 echo '<table>
                  <tr>
                  <td>
                  '.$Item["title"*.'<br/>
                  '.date("d M Y", $Itemé"pubDate"]).'<br/>
                  '.$Item["description"].'
                  </td>
               </tr>
            </table><br/><br/>';
          }
    }
}

08 - Creare l'istanza
Ora che abbiamo definito la classe, dobbiamo creare un oggetto con cui lavorare: un'istanza con nome di questa classe. l'operazione è uguale a quella per la creazione di un nuovo array o stringa: basta assegnare un nome e poi indicare all'interprete PHP che stiamo creando un'istanza della classe.
$rss=new RSSFeed();

09- Chiamare le funzioni
Ora possiamo aggiungere i feed RSS all'oggetto appena creato. Uniremo i feed dei due migliori blog di gadget, Gizmodo e Engadget. per eseguire questa operazione chiamiamo la funzione addFeed degli oggetti con gli URL dei feed.
$rss->addFeed("http://feeds.uk.gizmodo.com/rss/latest/gizmodo/all");
$rss->addFeed("http://www.engadget.com/rss.xml");

10 - Esportare l'HTML
Mentre chiamiamo la funzione addFeed, l'oggetto RSSFeed lavora dietro le quinte per aggiungere le voci e ordinarle correttamente, sostanzialmente trasformando i due feed in uno unico. Se lo desideriamo, possiamo aggiungerne più di due e l'oggetto continuerà a unirli e ordinarli man mano che procediamo. Al termine, chiamiamo la funzione exportAsHTML per visualizzare nel browser il feed creato.
$rss->exportAsHTML();

M.H.