Tutorial – Uso delle classi in php – Esempio di base completo

Diagramma oggetti di classe

Un diagramma generico su come può essere strutturata una gerarchia di classi. Il concetto è identico in qualsiasi linguaggio di programmazione, non solo php (1)

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.

Copyright immagini

(1) http://neuroevolution.wordpress.com/

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *