Nei tutorial precedenti abbiamo visto una panoramica di cos’è la programmazione a oggetti, della sua strutturale generale in php e del suo uso di base.
Abbiamo inoltre visto, in un altro articolo, come è possibile estendere una classe per poter così utilizzare i suoi metodi in un’altra classe (si parla di eredità di classe).
Ora saldiamo tutte le nozioni con un esempio organico e completo, che potete liberamente scaricare per eseguire test personali.
L’esempio è semplicistico e si basa su un form attraverso cui l’utente invia alcuni dati personali: nome, anno di nascita, email.
Noi ci occuperemo di prendere questi dati e di controllare la loro validità. Se i dati inviati sono corretti, saranno stampati a video. Se invece contengono degli errori, sarà stampato il relativo errore personalizzato.
Faremo uso di due classi, costruite all’interno dello stesso file (da importare nell’index.php):
– classe “StampaErrori”: nel caso si riscontrino errori, stabilirà quale errore stampare a video.
– classe “Persona”: controlla la correttezza dei dati passati. Sarà questa classe che istanzieremo in index.php. La classe “Persona” estenderà la classe “StampaErrori”: potrà quindi accedere ai metodi di quest’ultima per stampare gli errori.
Per una maggiore comprensione e per una visione d’insieme dell’esempio, scaricate innanzitutto lo zip contenente i codici sorgente.
Il form di invio dei dati
Il form usato dall’utente per inviare i dati non ha niente di particolare. Vediamolo per completezza.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<form action="" method="post" style="margin-top:30px;"> <div class="riga"> <div class="left">Nome:</div> <div class="right"><input type="text" name="nome" value="<?php if(isset($_POST['nome'])) echo $_POST['nome'];?>" /></div> </div> <div class="riga"> <div class="left">Anno di nascita:</div> <div class="right"><input type="text" name="anno" value="<?php if(isset($_POST['anno'])) echo $_POST['anno'];?>" /></div> </div> <div class="riga"> <div class="left">Email:</div> <div class="right"><input type="text" name="email" value="<?php if(isset($_POST['email'])) echo $_POST['email'];?>" /></div> </div> <div class="riga"> <div class="left"></div> <div class="right"><input type="submit" value="Invia" name="invio" /></div> </div> </form> |
StampaErrori: classe per la stampa degli errori
Diamo prima un’occhiata alla classe “StampaErrori” in generale. I commenti coprono i dubbi generali, ma più sotto commenteremo le parti essenziali.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
class StampaErrori{ //rendo pubbliche le proprietà (variabili) che saranno usate nella classe public $nome; public $anno; public $email; private $errore_mess=""; //se questa proprietà rimane vuota, allora i campi non avranno errori //array che conterrà l'errore da stampare per ogni elemento del form public $errore_array = array( "nome" => "Il nome non deve essere vuoto e deve essere composto da caratteri alfanumerici.", "anno" => "L'anno di nascita deve essere superiore al 1900", "email" => "L'e-mail deve essere scritta correttamente nella forma: 'nome@sito.estensione'" ); public $elementi=array(); // array che contiene gli elementi esatti, da stampare a video //metodo costruttore, condiviso dalla sottoclasse Persona //i valori dei post, per default, vengono associati a queste proprietà della classe public function __construct() { $this->nome = $_POST['nome']; $this->anno = $_POST['anno']; $this->email = $_POST['email']; } //metodo che immagazzina nella variabile $errore_mess l'errore del campo che è stato passato come parametro protected function segnalaErrore($campo){ if($this->errore_array[$campo]) $this->errore_mess.=$this->errore_array[$campo]."<br />"; } //metodo che stampa gli errori (se la variabile $errore_mess non è vuota), oppure segnala che il form è corretto protected function stampaErr(){ if($this->errore_mess!=""){ echo $this->errore_mess; return false; }else{ echo "L'invio del form è andato a buon fine"; return true; } } } |
La classe per la stampa degli errori conterrà tre metodi:
– __construct(): metodo costruttore. Recupera semplicemente i dati del form, immagazzinandoli in variabili.
– segnalaErrore(): prenderà come parametro uno dei campi passati dal form. In base a quale sia il campo passato, prenderà il rispettivo valore dall’array “errore_array”. Da notare che il metodo ha l’attributo protected: è quindi accessibile solo dalla classe e da quelle che la ereditano, ma non dall’esterno.
– stampaErr(): è questo metodo che stampa fisicamente gli errori a schermo.
Persona: classe per il controllo della correttezza dei dati
Sarà la classe “Persona” che istanzieremo per controllare i dati inviati dal form. Se i dati daranno un errore, si occuperà di recuperare i metodi della classe “StampaErrori” vista sopra.
Per recuperare i metodi di “StampaErrori” usare la keyword extends: in questo modo “Persona” erediterà i metodi della superclasse.
Nell’esempio ho inserito, per completezza, anche una costante e una proprietà statica: vedremo poi come sarà richiamata all’esterno.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
//Classe che controlla la correttezza dei dati passati dal form //estende la classe StampaErrori: questo significa che può accedere ai suoi metodi (o proprietà) pubblici class Persona extends StampaErrori{ const STATO="Italia"; //Proprietà statica. Funziona come le costanti (richiamate con self), ma il suo valore puù essere cambiato public static $regione="Veneto"; //metodo di partenza: richiama tutti i metodi di controllo del form più sotto e, infine, stampa il risultato richiamando il metodo stampaErr public function controllaTutto() { $this->controllaNome(); $this->controllaAnno(); $this->controllaEmail(); return $this->stampaErr(); } //controlla il campo "nome" public function controllaNome(){ if($this->nome!="" and is_string($this->nome)){ //il campo "nome" non ha errori: il suo valore è immagazzinato nell'array $elementi['nome'] $this->elementi['nome']="Nome: ".$this->nome; }else{ //il campo "nome" ha degli errori: viene passato il nome del campo al metodo "segnalaErrore" della classe StampaErrori //che si occuperà di stampare l'errore $this->segnalaErrore('nome'); } } //controlla il campo "anno" public function controllaAnno(){ if($this->anno>=1900){ $this->elementi['anno']="Anno di nascita: ".$this->anno; }else{ $this->segnalaErrore('anno'); } } //controlla il campo "email" public function controllaEmail(){ if(is_string($this->email) and preg_match('/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{1,4}$/', $this->email)){ $this->elementi['email']="Email: ".$this->email; }else{ $this->segnalaErrore('email'); } } } |
Come notate, per ogni elemento del form passato ho creato un metodo di controllo dai dati.
Il metodo controllaTutto() avvia gli altri metodi di classe e inoltre richiama il metodo stampaErr() della superclasse: quest’ultimo ritornerà true soltanto se tutti i dati inseriti saranno corretti.
Non ci resta che vedere come avviare l’intero meccanismo.
Index.php: istanziare la classe e avviare i controlli
Nella pagina dell’index.php, dopo l’invio del form, includeremo innanzitutto il file “class_persona.php” che contiene le due classi viste sopra (“StampaErrori” e “Persona”).
Dopodiché istanziamo la classe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//controllo dei dati e stampa dell'anagrafica if(isset($_POST['invio'])){ include("class_persona.php"); $persona=new Persona(); //$persona è detto "oggetto" o "istanza di classe" if($persona->controllaTutto()){ echo "<br /><br />Stato: ".Persona::STATO."<br />"; echo "Regione: ".Persona::$regione."<br />"; echo $persona->elementi['nome']."<br />"; echo $persona->elementi['anno']."<br />"; echo $persona->elementi['email']; } } |
Come specificato sopra, $persona->controllaTutto() richiamerà i vari metodi della classe “Persona” e restituirà true se tutti i dati inseriti saranno corretti.
Solo in questo caso richiameremo l’array “elementi” della classe “Persona”, contenente i dati corretti da stampare per ogni campo.
(1) http://neuroevolution.wordpress.com/