Corso php

Corso Backend ITS 2017 PHP Programming

Programma del corso

1 PHP: un linguaggio interpretato

PHP è prima di tutto un linguaggio interpretato
I linguaggi di programmazione possono essere interpretati o compilati
(a parte Java che è un'altra cosa ancora).

Un linguaggio compilato (C, C++…) prevede che il codice sorgente venga passato per un
compilatore appunto, che lo trasforma in una serie di procedure comprensibili al processore.

Dunque un’applicazione compilata “dialoga” direttamente con il processore.
In un linguaggio interpretato (PHP, Perl, Python, Ruby, …) invece,
viene eseguito direttamente il codice sorgente dall’interprete ed è
l’interprete a “dialogare” con il processore.

2 Cos'è una pagina dinamica

Una pagina dinamica

Vogliamo che il nostro sito abbia un colore di sfondo diverso per ogni giorno.
Vogliamo che il nostro sito riporti sempre la data e ora aggiornata.


Con PHP basteranno poche righe di codice per automatizzare questo processo.

<html>
<?php if (date("Y") == "2014") { ?>
<body bgcolor="#E6E6FA">
<?php } else { ?>
<body bgcolor="#E6E6FF">
<?php } ?>
<h1>Hello world!</h1>
<p><a href="http://www.w3schools.com">Visit W3Schools.com!</a></p>
</body>
</html>


3 La documentazione ufficiale

La documentazione ufficiale
Ci sono molti buoni motivi per scegliere PHP:
● E' gratuito;
● E' utilizzatissimo quindi troveremo una miriade di librerie e script già pronti;
● E' documentato in modo estremamente dettagliato.

Su www.php.net si trova tutto quello che serve.
Dovrete impare ad utilizzare questa documentazione:

Questo codice
date("Y");

Mi restituirà l'anno corrente nel formato "2017", a quattro cifre.

Andate a vedere quante lettere posso passare alla funzione date www.php.net/date

Esistono circa 3000 funzioni come questa in PHP.
Non possiamo conoscerle esattamente tutte, come funzionano,
che parametri passano, in che ordine, eccetera.

Anche il programmatore più esperto fa spesso capo alla documentazione.


Nel caso specifico di date,
mi compariranno tutte le funzioni per la gestione del tempo.

Imparare a conoscere questa documentazione fa risparmiare un sacco di tempo.

4 Hello World

Hello World

Scrivete questo codice con il vostro editor e salvatelo come hello.php
nella cartella www o htdocs.

<?php
echo "Hello World";
?>

Sul vostro browser digitate http://localhost/hello.php
(dopo aver avviato il webserver).

Ed ecco stampato a video "hello world".

5 Regole e sintassi

Regole e sintassi
Analizziamo ora il nostro script hello.php preparato nella lezione precedente:
<?php
echo "Hello World";
?>

I tag di apertura e chiusura

Come vedete bisogna segnalare la presenza di codice php con gli appositi tag.

Il contenuto di un codice PHP va quindi sempre inserito in questi tag

Esistono altri tag di apertura e chiusura, dipende dalla configurazione
del web server.

echo
echo é il comando utilizzato per gli output a video.
Si può utilizzare anche print.

Gli "apici doppi" servono ad indicare che si tratta di una stringa.
Avremmo potuto utilizzare anche gli 'apici singoli';
in questo caso non cambierebbe nulla, ma l'uso delle virgolette o degli apici
in altri casi può comportare differenze notevoli.

il punto e virgola;
Ogni dichiarazione in PHP deve terminare con un il punto e virgola.
Unica eccezione le strutture che utilizzano le parentesi graffe
(strutture di controllo, cicli, funzioni, classi).

Estensione
Qualsiasi script PHP deve essere salvato in un file con estensione .php.
A seconda della configurazione di apache, è possibile che vengano accettate
anche altre estensioni.

6 Relazione tra PHP e HTML

Relazione tra PHP e HTML
Torniamo sul primo esempio di pagina PHP visto:
<!DOCTYPE HTML>
<html>
<head>
<meta content="text/html; charset=utf-8">
<meta name="author" content="Garibaldi Mauro">
<title>Untitled</title>
</head>
<body>
<h1>
<?php echo "Hello World"; ?>
</h1>
</body>
</html>

La colorazione del precedente codice evidenzia come il normale codice HTML subisca ad un
certo punto una interruzione, causata da quello che prende il nome di tag di apertura PHP

<?php. Similmente il codice HTML riprende subito dopo un'altra sequenza di caratteri ?> che
costituiscono il tag di chiusura di PHP.

● Il PHP convive con l'HTML, nel senso che una pagina PHP è costituita il più
delle volte da una fusione di HTML e istruzioni PHP.
● Le istruzioni PHP sono separate dal codice HTML attraverso due delimitatori,
il tag di apertura <?php ed il tag di chiusura ?>.
● Ogni istruzione PHP termina con un punto e virgola.

A volte potrete trovare questo tag di apertura: <?.
Si tratta di una versione "ridotta", che non sempre funziona.

C'è anche la possibilità di poter utilizzare dei tag del tipo <% e %>.

con le versioni più recenti di PHP si può usare;
<?= "Hello World"; ?>
al posto di
<?php echo "Hello World"; ?>

7 Variabili

Variabili
Le variabili sono dei contenitori di informazioni che possiamo definire e modificare
nell’esecuzione del nostro script.

In PHP le variabili iniziano con il simbolo $ e continuano con lettere e/o
numeri ma non possono iniziare con un numero.

Questi sono tutti nomi di variabile corretti:
$a
$a1
$VariabileNumero3
Questo non è un nome di variabile corretto:
$1x


I nomi delle variabili sono case sensitive quindi: $vaRIabile è
diverso da $variabile. Inoltre,

come funziona:
<?php
$saluto = "Hello World";
echo $saluto;
// verrà stampato a video Hello World
?>

operazioni numeriche:
<?php
$a = 5;
$b = 10;
$c = $a + $b;
echo $c;
// verrà stampato a video 15
?>

8 Tipi

Tipi
Il tipo di una variabile è il formato dei dati che contiene.

i tipi principali e le loro caratteristiche.

Stringa
La stringa è una sequenza di caratteri alfanumerici.

Int
Un qualsiasi numero intero.

Float
Un numero con la virgola. Attenzione, in PHP si usa il punto.

Boolean
Un booleano può assumenre solo due valori: TRUE o FALSE
e viene analizzato da alcune strutture di controllo.

Per esempio:

if (se questa espressione è vera)
{
esegui questo codice
}
else // Se invece è falsa
{
esegui questo codice
}

un esempio concreto:
<?php
$a = 4;
$b = 7;
if ($a > $b)
{
echo "La variabile a è maggiore alla variabile b";
}
else
{
echo "la variabile b è maggiore alla variabile a";
}
# Potete provare questo codice modificando i valori di $a e $b
?>

Le keyword TRUE e FALSE esistono solo per la chiarezza del codice,
in realtà assegnano rispettivamente il valore 1 e 0.

Gli array
L’array non è altro che una collezione di valori identificabili da una chiave:

<?php
$mioArray = array("mela", "pera", "banana", "pesca");

// Se scrivo
echo $mioArray[0];
// Stampa mela
//(i valori in un array sono indicalizzati a partire da 0)

echo $mioArray[1];
// Stampa pera

?>

9 Costanti

Costanti
La costante può contenere stringhe o numeri ed è un valore non mutabile.
Ogni tentativo di ridefinirla fallirà e produrrà un errore di tipo notice.

La sintassi per definire una costante
<?php

define("NOME_COSTANTE", "valore della costante");
// per convenzione le costanti si scrivono in maiuscolo

// si richiama semplicemente così
echo NOME_COSTANTE;

?>

10 I commenti

I commenti
Sono una parte del codice che non viene elaborata e ci serve per "segnalare"
alcuni punti, per spiegare alcuni passaggi o per documentare il codice.

Esistono tre modi per inserire un commento in uno script php

Primo:
<?php
// commento - questo script stampa hello world
echo "Hello World";
?>

Secondo:
<?php
# commento - questo script stampa hello world
echo "Hello World"; // posso anche commentare qui
?>

Terzo:

<?php
/**
* Questo è un commento su più righe.
* Si usa prevalenetemente per documentare metodi e classi
* - non sapete di cosa sto parlando * Ma quando ci arriveremo capirete tutto
*/
echo "Hello World";

?>

Un buon codice è commentato e documentato! Fatelo prima di tutto per voi.
Quando riprendete un codice che avete scritto in passato sarà più facile leggerlo.

11 Approfondimento sulle stringhe

Approfondimento sulle stringhe
Le stringhe possono essere delimitate dalle virgolette o dagli apici con effetti diversi, vediamoli:
<?php
$nome = "Mauro";
echo "il mio nome è $nome"; // stampa il mio nome è Mauro
echo 'il mio nome è $nome'; // stampa il mio nome è $nome
# Gli apici non sono sensibili alle variabili le virgolette sì, ma entrambi sono
sensibili a se stessi
?>


Le stringhe possono essere concatenate ovvero unite tramite il punto.
<?php

$a = "Hello";
$b = " World";
echo $a . $b; //stampa Hello World

$nome = "Mauro";
$cognome = "Bogliaccino";
$frase = 'Il mio nome è ' . $nome . ' e il mio cognome è ' . $cognome;

# è anche possibile aggiungere parti alla stringa
$stringa = "Ciao ";
$stringa = $stringa . "a tutti";
echo $stringa; // stampa ciao a tutti

// un modo più elegante per svolgere questa operazione consiste nel
mettere il punto davanti all'uguale
$stringa = "Ciao ";
$stringa .= "a tutti";

?>

12 Gli operatori

Gli operatori
L’operatore di assegnazione
Abbiamo già visto che per assegnare un valore ad una variabile utilizziamo l’operatore =.
Questo operatore è unicamente di assegnazione e NON di confronto. Se scrivo questo codice:
if ($a = 4)
{
//esegui un'operazione
}

Questa espressione assegna a $a il valore 4, come è ovvio
restituirà TRUE, quindi eseguirà sempre l’operazione.

Per verificare se $a vale 4, dovremo utilizzare

Gli operatori di confronto
// questo è il codice corretto per verificare se $a vale 4
if ($a == 4)
{
//esegui un'operazione
}
// i principali operatori di confronto con degli esempi
$a = 5;
$b = 5.0;
$c = 3;
$d = "5";
$a == $b // Questa espressione è vera: 5 è uguale a 5.0
$a === $b // Falso. L'operatore === significa identico (ovvero anche dello
stesso tipo); $a è INT mentre $b è FLOAT
$a == $d // Vero: 5 è uguale alla stringa 5
$a === $d // Falso $d è una stringa $a un intero
$a > $c // Vero: 5 è maggiore di 3

$a >= $c // Vero: 5 è maggiore o uguale a 3
$b < $c // Falso: 5 non è minore a 3
$a <= $b // Vero: 5 è minore o uguale a 5.0
$a != $c // Vero: l'operatore != significa diverso da; quindi è vero che 5 è
diverso da 3

Gli operatori logici
● OR: Valuta se una condizione è vera in almeno un caso
● AND: Valuta se la condizione è vera in tutti i casi
● XOR: Valuta se una condizione è vera e l’altra è falsa
Vediamo subito degli esempi
if ($a > 10 AND $b == 7 AND $c != "fiore")
{
// questo codice viene eseguito se $a è maggiore a 10
// $b è uguale a 7
// e $c non contiene la stringa fiore
}
if ($a >20 OR $b == 4)
{
//questo codice viene eseguito se $a è maggiore a 20
//oppure se $b è uguale a 4
//e anche se le due condizioni sono rispettate
}

if ($a == 3 XOR $c < 3)
{
// questo codice viene eseguito Se $a è uguale a 3 e $c NON è minore di 3
// oppure se $a NON è uguale a 3 e $c è minore di 3
}

Gli operatori matematici
$a = 4 + 7 // somma
$a = 4 - 7 // sottrazione

$a = 4 * 7 // moltiplicazione
$a = 4 / 7 // divisione
$a = 7 % 4 // resto della divisione. In questo caso 3

Operatori di incremento
Gli operatori ++ e -- servono per aumentare / diminuire di 1 il valore di una
variabile. Sono molto utilizzati nei cicli.
$a = 5;
$a++;
echo $a; // stampa 6
$a = 5;
$a--;
echo $a; // stampa 4

13 Conversione dei tipi in PHP il cast

Conversione dei tipi in PHP: il cast.
Vediamo un esempio semplice ma efficace:
<?php
echo '5' * '3';
?>
Abbiamo chiesto al PHP di mostrarci il risultato di una moltiplicazione tra due stringhe. Questa
operazione non ha alcun senso eppure se lanciamo lo script otteniamo come risultato "15"
ovvero il prodotto tra dei numeri contenuti all'interno della stringa. Per capire cosa sia successo
vediamo i singoli passi che hanno portato a questo risultato:



il PHP deve risolvere l'espressione '5' * '3';
poiché si tratta di un operatore algebrico (la moltiplicazione *) il PHP si aspetta di trovare
due numeri;
● entrambi i fattori sono però delle stringhe ( '5' e '3' ) allora il PHP prima di procedere
deve convertirle in numeri. Questa operazione di conversione di tipo (da tipo stringa a
tipo numero) viene detta cast. La stringa '5' diventa il numero 5 e la stringa '3' diventa il
numero 3;
● il PHP adesso può effettuare il prodotto tra i numeri 5 e 3;
● viene mostrato il numero 15.
Il PHP quindi effettua in maniera trasparente, ovvero senza una esplicita indicazione, delle
conversioni di tipo ogni qualvolta deve effettuare una operazione su un tipo di dati diverso da
quello atteso. Ovviamente questa conversione può portare a risultati privi di significato: "casa"
* "3" sarà uguale a 0 poiché la stringa "casa" non sottintende un valore numerico e perciò sarà
convertita nel numero 0.
Vediamo ora un esempio di conversione da numero a stringa:
<?php
echo 'un numero a caso: ' . 43;
?>
E' evidente che in questo caso il numero 43 verrà convertito in stringa prima di essere accodato
attraverso l'operatore "." che lavora solo su stringhe.
Il caso più interessante di conversione di tipo però è quello che da come risultato il tipo
booleano. Come accennato nella precedente lezione a proposito degli operatori logici, spesso
capita che il PHP debba eseguire un'operazione e si aspetta che i dati su cui lavorare siano di
tipo booleano (come nella condizione del costrutto if) ma invece gli vengono forniti dati di altro
tipo (interi, stringhe, array).

PHP procederà quindi ad una conversione che seguirà queste regole:
● Tutti i numeri sono convertiti in true tranne lo 0
● Tutte le stringhe sono convertite in true tranne le stringhe vuote ("") e quelle che
valgono "0"
● Tutti gli array sono convertiti in true tranne quelli vuoti (senza elementi)
Come sarà chiarito dal seguente esempio, l'uso di diversi tipi di dati e la loro implicita
conversione in booleano permette di scrivere codice molto compatto ed efficace.
<?php
$array = array();
// conversione implicita da array a booleano
if($array)
{
echo 'l\'array $array ha almeno un elemento <br>';
}
else
{
echo 'l\'array $array è vuoto <br>';
}
$stringa = 'ciao';
// conversione implicita da stringa a booleano
if($stringa)
{
echo 'la stringa $stringa vale ' , $stringa;
}
else
{
echo 'la stringa $stringa è vuota';
}
$numero = 123;
// conversione implicita da numero a booleano
if($numero)
{
echo 'la variabile $numero è diversa da 0';
}
else
{

echo 'la variabile $numero è uguale a 0';
}
?>

14 Le funzioni native

Le funzioni native
Funzioni per le stringhe
Mettiamo di voler sapere da quanti caratteri è composta la frase: “La mia casa ha due porte e
due finestre”.
Utilizzeremo la funzione strlen. Vediamola nella documentazione -> www.php.net/strlen
La descrizione è la seguente:
int strlen ( string $string )
Il formato è:
● Cosa ritorna la funzione
● Il nome della funzione
● Gli argomenti della funzione
Nel nostro caso strlen ritorna un INT (ovvero il numero di caratteri), e passa un unico argomento
ovvero la stringa stessa.
Esempio di utilizzo:
<?php
$stringa = “La mia casa ha due porte e due finestre”;
$num = strlen($stringa);
echo $num;
// oppure
echo strlen($stringa);
?>
Funzioni per array
Vi siete fatti un po’ di pratica con la guida? Guardate la funzione count (ormai dovreste sapere
come trovarla). Con count contiamo gli elementi di un array. Ritorna un INT (il numero di
elementi) e passa un array come argomento.
<?php
$frutta = array(“mela”, “pera”, “banana”, “pesca”);
$num = count($frutta); // $num avrà valore 4
?>
E se volessimo ordinare il nostro array in ordine alfabetico?
Utilizzeremo la funzione sort

<?php
$frutta = array(“mela”, “pera”, “banana”, “pesca”);
sort($frutta);
?>
Il nostro array sarà modificato ed avrà assunto ordine alfabetico.
Funzioni matematiche
approfitto di questo paragrafo per mostrarvi come le funzioni possano essere nidificate
<?php
$x = 3.57; // Vediamo come ricavare l'intero di un numero con la funzione
intval
echo intval($x); // stampa 3
// vediamo come calcolare la radice quadrata di un numero con sqrt
echo sqrt(16); // stampa 4
// mettiamo che desidero l'intero della radice quadrata di un numero //
posso fare così:
$x = 10;
$y = sqrt($x);
$z = intval($y); //$z vale 3
// oppure posso nidificare le funzioni
$z = intval(sqrt($x));
?>
Immagino che a questo punto vi rendiate conto che c’è una funzione per tutto, basta saperla
cercare. L’unico insieme di funzioni per il quale ritengo di dover fare un breve approfondimento,
sono le funzioni legate al tempo, in quanto necessitano di qualche spiegazione preliminare.
Le funzioni di tempo
Il concetto fondamentale nella manipolazione del tempo in PHP (e non solo in PHP) è lo UNIX
TIMESTAMP o semplicemente timestamp. Il timestamp rappresenta il numero di secondi
trascorsi dal 1 gennaio 1970. Nel momento in cui sto scrivendo il timestamp è:
1225458927
Vi può sembrare bizzarro rappresentare il tempo in questo modo, in realtà è molto comodo in
particolare quando si tratta di fare dei confronti o dei calcoli.

Per noi è molto semplice ad esempio stabilire se viene prima il 6 febbraio 2006, il 10.4.08 o il 7
ago 1997, ma è ovvio che in un codice è notevolmente più semplice confrontare i tre timestamp.
Al contrario non possiamo mettere nel nostro guestbook una cosa del genere:
“questo messaggio è stato lasciato il 1225458927”.
Schematicamente: è meglio memorizzare una data in forma di timestamp in modo da poter
fare calcoli e confronti, ma poi dovremo anche saper trasformare questo numero in un output
“umano”.
Se vogliamo conoscere il timestamp attuale ci basterà utilizzare la funzione time
echo time();

15 Input dei dati FORM

Input dei dati – I FORM
In questo capitolo tratteremo il principale metodo che ci permette un input di dati verso la nostra
applicazione, ovvero i form. Vi capiterà certamente spesso di incontrare dei form; alla fine di
questa lezione (come pure di tutte le altre), vi è la possibilità di inserire un commento o una
domanda. Questa operazione avviene appunto tramite un form. Chiunque capisca qualcosa di
html, sa benissimo come realizzarne uno. Un altro conto è come intercettare questi dati e come
trattarli.
Iniziamo con creare un semplicissimo form che richiede il nome e un messaggio.
<form action="elaborazione.php" method="POST">
nome:<br>
<input type="text" name="nome" />
<br><br>
messaggio:<br>
<textarea name="messaggio"></textarea>
<br><br>
<input type="submit" value="invia" />
</form>
Salvatelo come form.php (o come form.html, in quanto contiene solo html).
Esaminiamo il nostro form:
● Con “action” indichiamo il nome della pagina che verrà caricata una volta premuto sul
tasto invia.
● Method ci indica che metodo vogliamo utilizzare per passare i valori alla pagina definita
in action.
● Esistono due metodi:
○ GET: Questo metodo permette di far passare i valori accordandoli all’url. Quando
sulla barra dell’url vedete qualcosa tipo www.nomesito.com/pagina.php?
valore=1&opzione=cancella , significa che si sta facendo passare a pagina.php
tramite il metodo GET la variabile valore settata a 1 e la variabile opzione settata
su cancella. Utilizzeremo il metodo GET quando per forza di cose dovremo far
passare dei valori tramite un link. Nei form è preferibile utilizzare il metodo
○ POST che passa i valori in background e soprattutto non è limitato come GET a
256 caratteri.
● Infine con name definiamo il nome della variabile che passiamo.
Ora vediamo come recuperare i nostri valori. Creiamo la pagina elaborazione.php in questo
modo:

<?php
$nome = $_POST['nome'];
$messaggio = $_POST['messaggio'];
echo "$nome ha scritto:<br><br>";
echo $messaggio;
?>
Come vedete $_POST è un array associativo, dunque a $_POST['nome'] corrisponderà quello
che abbiamo inserito nel campo nome. Avremmo potuto utilizzare direttamente $_POST, ma
per comodità spesso si assegna una variabile “normale” come ho fatto io.
Ovviamente quello che abbiamo fatto ha poco senso; ma vedremo nelle prossime lezioni come
questi dati inseriti dall’utente possano essere salvati ad esempio in un file di testo o in una
tabella compatibile con excel o finalmente in un database

16 $_GET

$_GET
Probabilmente avrete già notato che alcuni link presenti nei siti web puntano ad indirizzi (URL)
piuttosto complessi che accodano al nome della pagina da visualizzare anche una serie di
parametri. Ad esempio il link http://www.phpnews.it/forum/index.php?board=1.0 porta al nostro
forum PHP. E' evidente che questo URL si riferisce allo script "index.php" ma notiamo anche il
testo "?board=1.0".
Questa parte dell'indirizzo si chiamata query string ed ha lo scopo di conservare delle
informazioni da passare allo script chiamato. Tali informazioni, separate dal resto dell'URL
attraverso il punto interrogativo, sono presenti sotto forma di coppie chiave=valore. In questo
caso quindi alla chiave "board" è associato il valore "1.0". Nell'eventualità si debbano inserire
più coppie chiave=valore allora queste saranno separate dal carattere &.
Ad esempio:
http://www.miosito.it/index.php?chiave1=valore1&chiave2=valore2
A seguito della richiesta della pagina "index.php" il PHP, prima di eseguirne le istruzioni, legge
la query string, decodifica le informazioni in essa contenute e le rende disponibili allo script
come elementi di un array dal nome $_GET. La pagina "index.php" avrà quindi a disposizione
due elementi nell'array $_GET:
$_GET['chiave1'] di valore 'valore1'
$_GET['chiave2'] di valore 'valore2'
Ciò che accade quindi è molto simile a quanto visto nella scorsa lezione a proposito dei dati
inviati attraverso un form.
Con il seguente esempio vedremo come usare la query string per mostrare il testo della notizia
selezionata:
<?php
if(!$_GET)
{
echo 'Seleziona una notizia da leggere: <br><br>';
echo '<a href="index.php?id_notizia=1">Notizia 1</a> <br>';
echo '<a href="index.php?id_notizia=2">Notizia 2</a> <br>';
echo '<a href="index.php?id_notizia=3">Notizia 3</a> <br>';
}
else
{
$notizie = array(1=>'Questo è il testo della notizia numero 1',
'Questo è il testo della notizia numero 2',

'Questo è il testo della notizia numero 3');
$id_notizia = $_GET['id_notizia'];
echo 'Testo: <br>';
echo $notizie[$id_notizia] . '<br><br>';
echo '<a href="index.php">Torna all\'indice</a>';
}
?>
Attenzione, è importante salvare questo script con il nome index.php

17 $_POST

$_POST
Già dalle prime lezioni abbiamo subito imparato a mostrare, con la funzione echo, dei messaggi
all'utente ovvero a generare un output. Adesso vediamo invece come acquisire informazioni
dagli utenti, a gestire cioè l'input dell'utente. Un sito web interattivo deve saper raccogliere dai
suoi visitatori dati di diversa natura e per gli scopi più disparati.
Pensate ad esempio ad un forum ed alle attività ad esso collegate: registrazione, log-in, invio
messaggi, ecc. Tutte queste operazioni sono caratterizzate dall'invio, da parte dell'utente, di
diverse informazioni. Non solo testi (il nome, la password, i messaggi, ecc.) ma anche diverse
opzioni specificate attraverso l'uso di caselle di controllo (check box), pulsanti di scelta (radio
buttons), menu a discesa (drop down menu) e altro ancora.
Questi strumenti vengono messi a disposizione dall'HTML attraverso diversi tag (input, select,
ecc.) contenuti all'interno di un tag form. I dati inseriti dall'utente vengono inviati ad una pagina
specificata nell'attributo "action" dello stesso tag form. Il PHP provvederà a recuperarli ed a
inserirli in un array di nome $_POST come coppie chiave -> valore. Questo processo avverrà in
maniera trasparente ed automatica.
L'array $_POST ha una particolarità ovvero non rispetta le normali regole di visibilità delle
variabili poiché è accessibile da qualsiasi parte del nostro script, anche all'interno delle funzioni.
Per questo motivo lo si definisce superglobale.
L’esempio che vediamo è costituito da 2 files. Il primo è una normale pagina HTML che
contiene il form in cui inserire i dati. Questi verranno inviati al secondo file, che chiameremo
prova.php
Ecco l'HTML presente nel primo file. Si noti il valore dell'attributo action del tab form.
<form name="form1" method="post" action="prova.php">
<p>Inserisci il tuo nome: </p>
<p>
<input type="text" name="nome_utente">
<input type="submit" value="Invia">
</p>
</form>
Segue il codice della pagina prova.php, che riceverà i dati inviati dall'utente e che verranno
inseriti dal PHP all'interno dell'array $_POST.
<?php
echo('Il tuo nome è ' . $_POST['nome_utente']);
?>

Si noti come in questo ultimo script la funzione echo riesca a mostrare il nome inviato dall'utente
semplicemente utilizzando l'array $_POST. La chiave usata per ottenere il nome dell'utente
è "nome_utente" ovvero il valore dell'attributo "name" del tag input.
In realtà non è necessario che la pagina che realizza il form e quella che raccoglie i dati inviati
dall'utente siano distinte. Se l'attributo "action" viene lasciato vuoto, i dati verranno inviati alla
stessa pagina che ha generato il form

18 Le funzioni definite dall'utente

Le funzioni definite dall’utente
Abbiamo visto come PHP mette a disposizione un’infinità di funzioni.
Oggi vedremo come sia possibile creare delle funzioni personali, definite da noi stessi. Lo scopo
di definire una funzione è rendere il codice più leggibile. Ad esempio, se in uno script dobbiamo
eseguire più volte un’operazione, meglio scrivere una funzione; Io dico meglio scrivere una
funzione anche se dobbiamo ripetere solo due volte la stessa operazione. Aggiungo che se
dobbiamo fare due operazioni non identiche, ma simili dovremmo domandarci se non sia
possibile generalizzarle e farne un’unica funzione.
Inoltre, anche se dobbiamo svolgere una sola volta una data operazione, e questa operazione è
molto specifica, meglio racchiudere il codice in una funzione.
Utilizzate le funzioni, rendono pulito il vostro script ed in oltre, il fatto di suddividere il codice in
piccole unità specializzate è un concetto che sta alla base della programmazione ad oggetti che
vedremo più avanti.
Vediamo ora come si definisce una funzione:
function NomeFunzione(argomenti)
{
//codice da eseguire
return //valore da ritornare
}
Facciamo subito degli esempi, tenendo conte che una funzione non necessariamente deve
richiedere degli argomenti e non necessariamente deve ritornare qualcosa.
Esempio di una funzione che non prende argomenti e non necessita del return
function Saluto()
{
echo "Hello World!";
}
// Richiamando la funzione in questo modo
Saluto();
// Verrà scritto a video Hello World!
Una cosa importante che non ho detto: Se una funzione viene solo definita, non farà nulla.
Dovrà venire richiamata per essere eseguita.
Vediamo ora la stessa funzione ma scritta in modo da ritornare il valore

function Saluto()
{
$saluto = "Hello World";
return $saluto;
}
// In questo caso per visualizzare Hello World:
echo Saluto();
Vediamo un esempio di funzione che passa argomenti. Scriviamo una funzione che somma tre
numeri.
function Somma($a, $b, $c)
{
$risultato = $a + $b + $c;
return $risultato;
}
// Se ora provate a scrivere
echo Somma(7,3,5);
// Verrà stampato 15 a video
Due cose importanti:
1. Attenzione all’ordine degli argomenti. Nel nostro caso, quando definiamo la funzione,
scriviamo $a,$b,$c. Dunque il primo argomento che inseriremo quando richiamiamo
la funzione corrisponderà a $a all’interno della funzione e così via. Quindi nella nostra
funzione $a avrà valore 7.
2. Se dichiariamo 3 argomenti, dovremo inserire 3 argomenti obbligatoriamente altrimenti
produrremo un errore.
Provate a scrivere così:
echo Somma(5,2);
//otterrete qualcosa del genere
// Warning: Missing argument 3 for Somma(), called in …………
A volte è però necessario impostare quelli che vengono chiamati “argomenti facoltativi”. Come
ho detto nell’introduzione è un peccato scrivere due funzioni per svolgere due operazioni simili.

Mettiamo che nel nostro script ci dovesse capitare di dover sommare alcune volte due numeri
ed altre volte tre numeri. In questo caso andrà benissimo la nostra funzione Somma() con un
unico accorgimento: L’ultimo argomento dovrà essere facoltativo. Come fare? In questo caso si
risolverà così:
function Somma($a, $b, $c=0)
{
$risultato = $a + $b + $c;
return $risultato;
}
Se passo 2 argomenti $c avrà valore 0 e dunque non influenzerà il risultato. Se passo 3
argomenti $c verrà ridefinito con il valore inserito

19 include e require

include e require
Include e require sono due costrutti del linguaggio che servono per inserire nel nostro codice dei
file esterni. Non ci sarà molto da dire anche se le procedure di inclusione sono utilizzatissime. Il
formato è il seguente:
include “percorso/del/file/file.php”;
La differenza tra include e require stà principalmente nel fatto che, se il file invocato non viene
trovato, include produrrà un warnig mentre require produrrà un fatal error.
Vediamo ora come si utilizzano ed in particolare in che occasioni.
Chi di voi ha già installato un’applicazione php si sarà certamente imbattuto in un file di
configurazione, di solito config.php. Questo è un classico caso di utilizzo delle inclusioni.
Abbiamo la necessità di portare in giro per il nostro sito dei valori. Definire questi valori in ogni
pagina potrebbe andare bene, … fino a quando non dovremo modificare i nostri valori. In
questo caso sarà meglio avere questi valori in un file separato che andremo ad includere nelle
pagine che ci servono.
Salviamo questo file come config.php
$nome = "Mauro";
$cognome = "Garibaldi";
Ed ora scriviamo in un altro file
include "config.php";
echo $nome . ' ' . $cognome;
Come vedete le variabili $nome e $cognome sono correttamente valorizzate
Un altro caso frequente di utilizzo delle inclusioni è per tenere separate le definizioni delle
funzioni dal loro utilizzo. Prendete ad esempio la funzione Casuale() che abbiamo visto nella
lezione precedente e salvatela come casuale.php
Ora creiamo il nostro file
require "casuale.php";
echo Casuale(15);
Come potete osservare la funzione viene eseguita correttamente. Includere un file è un po’
come fare un copia e incolla del codice che vogliamo includere.

Immaginate che la funzione Casuale() potrebbe essere utilizzata in più pagine. E’ ovviamente
più elegante includere la funzione piuttosto che definirla in ogni pagina nella quale ci serve.
Un ultima cosa. Per evitare che il codice venga incluso più volte (cosa che potrebbe creare
problemi), sarebbe meglio utilizzare include_once e require_once.

20 I cicli D0, FOR e WHILE

I cicli – FOR e WHILE
I cicli sono delle strutture fondamentali del linguaggio e ci servono ad eseguire un codice più
volte. Facciamo un esempio solo a parole. Mettiamo che nel nostro database abbiamo un certo
numero di indirizzi email e che volessimo inviare un messaggio ad ognuno di questi indirizzi.
Schematicamente dovremo procedere come segue:
● Definire una variabile con il messaggio
● Connetterci al database
● Avviare un ciclo che:
○ Legge una riga del database estrapolando un email
○ Invia l’email con destinatario il dato appena preso e come messaggio quanto é
contenuto nella variabile definita all’inizio
○ Finché ci sono righe da leggere riprende dal punto a alla riga successiva
Vediamo però ora nel dettaglio i vari cicli di php
FOR
For è il ciclo più semplice e ci permette di eseguire un’operazione un numero noto di volte; la
sua struttura è questa:
for(partenza; arrivo; incremento)
{
// codice da eseguire
}
Facciamo subito un esempio concreto contiamo fino a 10.
for($i = 1; $i <= 10; $i++)
{
echo "Ho contato fino a $i<br>";
}
Come vedete si deve utilizzare un’unica variabile. Devo dire quanto vale $i al primo ciclo (1 nel
nostro caso), fino a che valore di $i deve continuare il ciclo, di quanto incrementare $i per ogni
ciclo (ricorderete che $i++ equivale a dire $i = $i + 1).
Facciamo un esempio più intelligente, mostriamo il contenuto di un array
$frutti = array("mela", "pera", "pesca", "prugna");
$max = count($frutti);
for($i = 0; $i < $max; $i++)

{
echo $frutti[$i] . ‘<br>’;
}
Dopo aver contato il numero di elementi dell’array $frutti, impostiamo un ciclo che parte da 0 (la
prima chiave di un’array è 0 ricordate) e si incrementa di 1 fino a che è minore del numero di
elementi dell’array.
A dire il vero, esiste un particolare tipo di for che serve proprio a scorrere il contenuto di
un’array:
FOREACH
Come detto foreach ci permette di scorrere un’array, in questo modo
$frutti = array("mela", "pera", "pesca", "prugna");
foreach ($frutti as $frutto)
{
echo $frutto . '<br>';
}
Praticamente diciamo: Finché ci sono elementi nell’array $frutti, assegna il valore di ciascun
elemento a $frutto.
Foreach può essere utilizzato con una sintassi un po’ più complessa per scorrere un array
associativo:
$dati = array("nome" => "Mauro", "cognome" => "Garibaldi", "età" =>
"36");
foreach ($dati as $key => $valore)
{
echo $key . ': ' . $valore . '<br>';
}
Adesso facciamo quello che abbiamo detto all’inizio, inviare un messaggio email a diverse
persone. Se guardate nella documentazione la funzione mail, noterete che passa diversi
argomenti che sono nell’ordine: il destinatario, il soggetto, il messaggio, gli header e parametri
come opzioni. Lasciamo perdere tutta la questione degli header che è estremamente
complessa. Bisogna però sapere che se voglio inviare un mail in formato html, o aggiungere
un’allegato dovrò imposare degli header molto precisi. Per evitare queste ed altre complicazioni,
è vivamente consigliato utilizzare la classe PHPMailer per l’invio di email (la vedremo nell’ultimo
capitolo del corso). Comunque per inviare un semplicissimo mail testuale, andrà benissimo

anche la funzione mail (vi ricordo che per funzionare, il php.ini dovrà essere correttamente
configurato come descritto nel capitolo relativo alla preparazione dell’ambiente di svilupo).
Adesso cominciamo, e cominciamo finalmente a fare qualcosa di divertente.
// Creiamo un array associativo con il nome dei nostri amici ed il loro email.
$rubrica = array("Mauro" => "Mauro@sito.com",
"Giovanni" => "giovanni@sito.com",
"Marco" => "marco@sito.com");
$oggetto = "prova invio email";
foreach ($rubrica as $nome => $email)
{
$messaggio = "Ciao $nome,\r\n ti scrivo questo messaggio come
prova di un programmino che sto realizzando";
mail($email, $oggetto, $messaggio);
}
Ogni volta che il nostro ciclo verrà eseguito, viene creato un messaggio personalizzato nel
senso che il nome sarà il nome abbinato all’email e questo messaggio verrà poi inviato al
destinatario.
WHILE
Abbiamo visto che for ci permette di eseguire un numero predefinito di cicli. Ma ci sono
diverse situazioni nelle quali ci è impossibile sapere a priori quanti cicli saranno necessari per
raggiungere un determinato obiettivo. In questo ci viene incontro la struttura while, la quale
continua ad eseguire il ciclo fin tanto che non si verifica la situazione FALSE. Dunque while
analizza il valore boleano di un’espressione.
Vediamo
while(fino a quando questa espressione è TRUE, continua ad eseguire il
seguente codice)
{
//codice
}
In concreto

$inc = 1;
while($inc <= 10)
{
echo "Ho contato fino a $inc<br>";
$inc++;
}
Questo script fa esattamente quello che faceva lo script che abbiamo utilizzato come esempio
per la struttura for ma in modo concettualmente diverso.
Facciamo il solito esempio stupido: Vogliamo vedere quanti tentativi ci vorranno prima che la
somma di tre numeri casuali tra 1 e 10 sia 23. Ovviamente non sappiamo quanti tentativi ci
vorranno (e ogni volta che eseguiremo lo script il numero sarà diverso); quindi dovremo affidarci
a while.
$tentativi = 1;
while($result != 23) // fino a che il risultato é diverso da 23 l’espressione è TRUE
{
$a = rand(1,10); // prendiamo tre numeri casuali
$b = rand(1,10);
$c = rand(1,10);
$result = $a + $b + $c; // Li sommiamo
$tentativi++; // E incrementiamo di 1 il numero di tentativi
}
// Quando $result è 23, quindi 23 != 23 è FALSE, il ciclo finisce
// Quindi stampiamo i risultati
echo "Ci sono voluti $tentativi tentativi per avere come risultato $result<br>";
echo "I tre numeri sono: $a, $b, $c.";

21 Le strutture di controllo

Le strutture di controllo
Ne abbiamo già accennato più di una volta (questo dimostra la loro importanza), ma ora faremo
un approfondimento.
IF ELSE
La più utilizzata delle strutture di controllo è certamente if / else. Abbiamo già visto in più di una
lezione come funziona, ma vale la pena ripeterlo
if(questa espressione è vera)
{
//Esegui questo codice
}
else //Se è falsa
{
//Esegui questo codice
}
Devo solo aggiungere una cosa: else non è obbligatorio. Se guardate l’ultimo script proposto
nella scorsa lezione, vedrete che all’interno del ciclo, utilizzo if senza else. Questo è un esempio
per dimostrare che spesso può capitare di avere necessità semplicemente di dire: “Se è così fai
questo” e il “se non è così” è irrilevante.
Le strutture if/else possono essere nidificate a piacere
if ($nome = "Mauro")
{
if($cognome = "Garibaldi")
{
echo "sei Mauro Garibaldi";
}
else
{
echo "Ti chiami Mauro ma non sei Mauro Garibaldi";
}
}
else
{
if($cognome = "Garibaldi")
{
echo "Il tuo cognome é Garibaldi ma non sei Mauro Garibaldi";
}

else
{
echo "Non sei Mauro Garibaldi";
}
}
Chiaramente più si nidifica e più risulta facile “incartarsi”. Per questo è certamente di aiuto un
corretta identazione.
ELSEIF
elseif ci permette di verificare se più condizioni diverse siano vere. Facciamo un esempio
if($n == 1)
{
echo "il numero é 1";
}
elseif($n == 2)
{
echo "il numero é 2";
}
elseif($n == 3)
{
echo "il numero é 3";
}
elseif($n == 4)
{
echo "il numero é 4";
}
else
{
echo "il numero é un qualsiasi numero maggiore a 4";
}
Personalmente preferisco, in casi come questo, utilizzare la struttura switch che rende maggior
chiarezza al codice.
SWITCH
switch è una struttura particolare. Analizza il contenuto di una variabile ed esegue un codice a
dipendenza del contenuto della stessa. La sintassi è la seguente:
switch(variabile)
{

case …. :
//codice
break;
case …. :
//codice
break;
//opzionalmente
default:
//codice
}
Riscriviamo subito l’esempio di elseif in modo che vi sarà subito chiaro
switch($n)
{
case 1:
echo "il numero é 1";
break;
case 2:
echo "il numero é 2";
break;
case 3:
echo "il numero é 3";
break;
case 4:
echo "il numero é 4";
break;
default:
echo "il numero é un qualsiasi numero maggiore a 4";
}
Come vedete switch analizza il contenuto della variabile $n. In seguito possiamo inserire un
numero infinito di casi. Quando un caso è “soddisfatto” verrà eseguito il codice che segue. I vari
casi terminano con break per evitare che possano essere valutati ulteriori casi, che in particolari
circostanze potrebbe dar luogo a comportamenti inaspettati (notate che break nello switch
funziona allo stesso modo che nei cicli).

Abbiamo infine la possibilità di utilizzare default per indicare cosa fare se nessuno dei casi viene
soddisfatto.
Come vedete ho fatto la stessa cosa di prima, ma ritengo che scritta così sia più leggibile ed
elegante.

22 COOKIES

COOKIES
Il cookies é un semplice file di testo contenente delle informazioni che noi andiamo a scrivere
sul computer client. Questo non crea ovviamente nessun problema di sicurezza, ma cercate di
non abusarne, andiamo sempre a scrivere qualcosa su un computer che non è nostro.
Il cookie ha un formato chiave – valore e nell’impostarlo andremo anche ad indicarne la
scadenza, oltre la quale si cancellerà.
La sintassi per la definizione è la seguente:
setcookie(nome del cookie, valore del cookie, scadenza);
Se volessimo ad esempio impostare un cookie chiamato “cognome”, contenente “Garibaldi” e
della durata di un’ora, faremo così
setcookie("cognome", "Garibaldi", time() + 3600);
// Per richiamarlo utilizzeremo la variabile superglobale $_COOKIE in questo
modo
echo $_COOKIE['cognome'];
N.B La scadenza è un argomento opzionale. Non dichiarandola, il cookie scadrà alla chiusura
del browser.
Considerate un’aspetto fondamentale. Il cookie viene inviato come header e l’header può
essere inviato una sola volta. Dunque la funzione setcookie deve essere dichiarata prima
dell’invio di qualsiasi output a video (che presuppone l’invio di un header appunto).
echo "hello world";
setcookie("cognome", "Garibaldi", time() + 3600);
E’ un errore. Anche un “a capo” all’esterno dei tag php é un output (lo dico perché a volte
capita).
qui è uno spazio vuoto prima del tag di apertura
<?php
setcookie ….. // da errore
?>

Facciamo un semplicissimo esempio pratico. Vorremmo che se un utente visualizza il nostro
sito per la prima volta sia accolto in un modo, mentre se ci è già stato sia accolto in un altro
modo.
Imposteremo un cookie. Per sapere se l’utente sia già stato sul nostro sito, ci interesserà
sapere solo se il cookie esiste. Lo faremo con isset che ci dice se una variabile è settata.
if(isset($_COOKIE['visitato']))
{
$saluto = "Bentornato";
}
else
{
setcookie("visitato", "SI", time()+5000000);
$saluto = "Benvenuto";
}
echo "
<h1>$saluto nel mio sito</h1>
";
Come vedete, controllo se il cookie è settato (non mi interessa il valore in questo caso). Se è
settato vuole dire che l’utente ha già visualizzato il sito, dunque il saluto sarà “Bentornato”. Se il
cookie invece non è settato, vuole dire che siamo alla prima visita, Quindi il saluto dovrà essere
“Benvenuto”; inoltre, ovviamente, setteremo il cookie. Infine stampiamo il saluto.
Se eseguite questo codice vi verrà stampato “Benvenuto sul mio sito”. Ora chiudete pure il
browser o visitate un altro sito e poi riaprite questa pagina. Vi verrà stampato “Bentornato sul
mio sito”.
Un’ultima cosa: Se dovessimo avere necessità di rimuovere un cookie, sarà sufficiente settarlo
con una scadenza già passata.
setcookie ("cognome", "Garibaldi", time() – 1000);

23 SESSIONI

SESSIONI
La sessione è come un contenitore nel quale posso mettere un numero indefinito di valori e
richiamarli da qualsiasi punto del mio sito. A differenza dei cookies non posso impostare una
scadenza prolungata. La sessione per sua stessa natura dura il tempo di una sessione, dunque
il tempo che io passo su un sito. Se chiudo il browser e riaccedo al sito, i dati di sessione non
esiteranno più. La sessione inoltre viene salvata sul server, a differenza del cookie che viene
scritto sul client. E per finire: 1 cookie = 1 valore, 1 sessione = indefiniti valori.
Con i cookie ha invece in comune la questione degli header che abbiamo trattato poco fa.
Facciamo subito un’esempio.
// prima cosa dobbiamo avviare la sessione – PRIMA di qualsiasi output
// utilizziamo la funzione session_start()
session_start();
// una volta avviata possiamo accedere all'array superglobale $_SESSION
$_SESSION['nome'] = "Mauro";
$_SESSION['cognome'] = "Garibaldi";
A questo punto i valori nome e cognome saranno disponibili in qualunque punto di qualunque
pagina del mio sito, a condizione che venga richiamata la sessione con la funzione
session_start().
Quindi se in un’altra pagina scriveremo
session_start();
echo $_SESSION['nome'];
// scriverà a video Mauro
L’esempio classico di utilizzo delle sessioni é il carrello della spesa nei siti di e-commerce. Voi
girate per il sito, ogni tanto mettete qualcosa nel carrello (che in pratica è una sessione) e poi
alla fine cliccate su acquista. A questo punto la sessione viene analizzata e vengono estratti tutti
gli articoli che avete memorizzato (messo nel carrello).
Un altro esempio potrebbe essere un semplice sistema di autenticazione. L’utente fa il login,
nome utente e password vengono controllati, se esistono e corrispondono avvio una sessione
impostando un parametro (qualsiasi). Ora nelle pagine che desidero proteggere, all’inizio,
verificherò l’esistenza del parametro di sessione che imposto in caso di login coretto. Se esiste
mostro la pagina, altrimenti reindirizzo l’utente alla pagina del login. Costruiremo più avanti un

sistema di autenticazione di questo tipo.
Per finire, se aveste necessità di distruggere una sessione, ad esempio per fare il logout
del nostro sistema di autenticazione basato sulle sessioni, utilizzeremo la funzione
session_destroy().

24 Leggere e scrivere sul filesystem

Leggere e scrivere sul filesystem
Oggi vedremo come sia possibile leggere e scrivere file tramite php. Una prerogativa
indispensabile affinché questo sia possibile, è di disporre dei necessari diritti di lettura e scrittura
sul file e sulla cartella che lo ospita.
Una delle funzioni di base per la manipolazione dei files è fopen, andate a vederla nella
documentazione.
fopen apre, o se non esiste crea un file. Passa come parametri il percorso e nome del file
ed il modo (se scendete un po’ nella documentazione troverete una tabella con i vari modi di
apertura). Noterete che restituisce un valore particolare, ovvero una risorsa.
Una risorsa non è altro che un riferimento che utilizzeremo in altre funzioni per collegare la
funzione che utilizziamo ad un evento. Faccio immediatamente un esempio per chiarire
$fr = fopen("prova.txt", "a+");
fwrite($fr, "Scrivo una riga nel file di testo");
fclose($fr);
Come vedete la variabile $fr serve ad indicare a quale evento ci si riferisce. fclose($fr) significa:
Chiudo il file che è stato aperto creando la risorsa $fr.
Se eseguite questo script, vedrete che nella medesima cartella dove risiede lo script, verrà
creato il file prova.txt che conterrà “Scrivo una riga nel file di testo”.
Se lo eseguite un’altra volta, troverete che la frase è stata riscritta. Se modificate la frase ed
eseguite nuovamente il codice, noterete che la frase è stata aggiunta alla fine del documento.
Questo perché abbiamo aperto con il modo a. Se avessimo voluto aggiungerla all’inizio del
documento avremmo dovuto utilizzare il modo r.
Se ora vogliamo leggere il nostro file, andremo ad utilizzare la funzione fread, che passa come
parametri la risorsa e la lunghezza che vogliamo leggere in byte, quindi (1 carattere = 1 byte)
quanti caratteri vogliamo leggere. Se volessimo leggere tutto il file, inseriremo come lunghezza
la dimensione in byte del file stesso, che ricaveremo grazie alla funzione filesize.
$fr = fopen ("prova.txt", "a+");
$testo = fread($fr, filesize("prova.txt");
fclose($fr);
echo $testo;
In effetti se quello che dobbiamo fare é semplicemente leggere tutto il contenuto di un file,
possiamo utilizzare la più comoda funzione file_get_contents().
Dovremo semplicemente scrivere:

$testo = file_get_contents("prova.txt");
echo $testo;

25 DDL: La struttura del database

Creare la struttura del database

Un database è un insieme di una o più tabelle nelle quali verranno poi
memorizzati i nostri dati.

Per creare il nostro database, sempre sulla pagina principale troverete un
campo di inserimento chiamato “crea nuovo database”. Nel campo scrivete rubrica e poi premete il pulsante “crea”.
MySql ci dirà che non ci sono tabelle nel database e ci proporrà di crearne una.
Spiegherò alla fine quello che stiamo per fare.
Scriviamo nel campo nome “rubrica_telefonica” e nel numero di campi “4″ e premiamo su
“esegui”.

Ora ci appare la schermata dove dovremo impostare i campi.
Nel primo scrivete “id” sotto “campo”, scegliete INT come tipo, 3 come lunghezza, “UNSIGNED”
come attributi, “auto_increment” sotto extra, e selezionate il primo radio button (vi darà
“primaria” nel tooltip).
Seconda riga. Campo -> “nome”, Tipo->VARCHAR, lunghezza ->20
Terza riga. Campo->”cognome”, Tipo->VARCHAR, lunghezza->20
quarta riga. Campo->”numero”, Tipo->VARCHAR, lunghezza->15
Ora premete su salva.
Una volta che la riempiremo, la nostra tabella avrà questo aspetto
id

nome

cognome

numero

1

Mauro

Garibaldi

12345678

2

Luigi

Rossi

123456

3

Marco

Bianchi

123456

Cosa abbiamo fatto.
La prima colonna è forse la più importante e la più complessa. Nei database relazionali, si è
soliti ad impostare quella che viene chiamata “chiave primaria”. Per convenzione questo indice
viene messo come prima colonna e chiamato “id” (potreste metterlo anche alla fine e chiamarlo
Ezechiele, ma perché si dovrebbe?). La chiave primaria è un numero univoco attribuito ad ogni
record (riga) della nostra tabella e che identifica quindi in modo univoco il dato.
Il suo tipo è INT (ovviamente perché é un numero). Abbiamo poi impostato auto_increment,
in modo che la numerazione sarà automatica e progressiva, ogni record riceverà un numero
senza che noi dobbiamo impostarlo ogni volta manualmente. Abbiamo infine impostato
UNSIGNED (non era obbligatorio farlo) in quanto l’id non potrà essere un numero negativo;
unsigned accetta solo numeri positivi.
Un’altra proprietà del nostro id è che non verrà riassegnato. Se io dovessi cancellare Luigi
Rossi, la nostra tabella apparirà così.
id

nome

cognome

numero

1

Mauro

Garibaldi

12345678

3

Marco

Bianchi

123456

Anche se dovessi cancellare l’ultimo dato, la numerazione riprenderebbe dall’id successivo
rispetto al dato cancellato.
In seguito la colonna nome e la colonna cognome sono delle stringhe con al massimo 20
caratteri, dovrebbero bastare.

La colonna numero di telefono. Avrei potuto impostare un tipo numerico. Siccome non
dobbiamo fare calcoli ho preferito anche qui usare una stringa. Questo ci darà maggiore libertà
nell’inserimento (non è sempre un bene). Potremo così utilizzare ad esempio il “+” per il prefisso
internazionale.
Bene, ora abbiamo preparato il database. Ora sviluppiamo l’applicazione.

26 La navigazione

La navigazione e la struttura delle pagine
Negli esempi che vi ho mostrato fino ad ora, ho utilizzato la tecnica di “immegere” il PHP nella
pagina html. Per questa applicazione utilizzerò un’altra tecnica che personalmente prediligo,
ovvero quella di far creare da PHP tutta la pagina html.
Naturalmente separando gli headers, la navigazione, eccetera ed inserendoli in un file separato
che andremo poi ad includere in tutte le pagine. In questo modo potremo separare il contenuto
“statico” (quello valido per tutte le pagine), dal contenuto specifico di ogni pagina.
Vediamo subito come:
Creiamo la nostra cartella di progetto (chiamiamola rubrica) nella directory www del web server.
In questa cartella creiamo la cartella “include” nella quale salveremo tutti i file esterni.
Creiamo il file page.php e salviamolo nella cartella include. In questo file inseriremo le funzioni
che ci interessano. Iniziamo da una funzione che semplicemente ci stampa l’header htm della
pagina (naturalmente mettete l’header che preferite, se lo desiderate create un foglio di stile css
e fatelo includere nel’header).

function HtmlHeader()
{
echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//
EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Titolo</title>
</head>
<body>
';
}
Continuiamo con una funzione che ci stamperà il footer

function HtmlFooter()
{
echo '</body>
</html>';
}

Ora, per esercitarci un po’ su quello che abbiamo imparato fino ad ora, creiamo una
navigazione dinamica. Facciamo in modo che se ci troviamo nella pagina, ad esempio,
dell’inserimento dati, la voce della navigazione “inserimento” non sia un link ma sia testo
semplice.
Per la nostra applicazione avremo bisogno di 4 voci nella navigazione: home, cerca, mostra
tutti, e inserisci.
Vediamo come realizzare questo tipo di navigazione:

function Navigation()
{
//Prima cosa dobbiamo sapere in che pagina siamo
//per fare questo utilizziamo l'array superglobale $_SERVER
//PHP_SELF ci restituisce il percorso e il nome del file
//mentre con la funzione basename togliamo il percorso in
//modo da avere solo il nome del file
$page = basename($_SERVER['PHP_SELF']);
//Ora scriviamo due array nel primo inseriamo le voci della
//navigazione, nel secondo (prestando attenzione alla corrispondenza)
//scriviamo il link
$PageName = array("Home", "Cerca", "Mostra tutti", "Inserisci");
$PageLink = array("index.php", "search.php", "showall.php", "insert.php");
// Ora quello che dobbiamo fare é scorrere l'array stampando il link
// Ma se siamo nella pagina alla quale il link fa riferimento
// Non lo stamperemo come link
for($i = 0; $i < count($PageName); $i++)
{
if($page == $PageLink[$i])//Se siamo nella pagina alla quale fa
riferimento il link
{
echo $PageName[$i];//Stampa solo il nome
echo '&nbsp;&nbsp;&nbsp;';
}

else //altrimenti stampa il link
{
echo '<a href="' . $PageLink[$i] . '">' . $PageName[$i] . '</a>';
echo '&nbsp;&nbsp;&nbsp;';
}
}
}
Ora abbiamo il nostro file page.php che contiene queste tre funzioni. Adesso per testarlo
creiamo, nella cartella principale del nostro progetto il file index.php, in questo modo:

<?php
//Prima cosa includiamo il file page.php contenente le nostre funzioni
include './include/page.php';
//Ora ordiniamo di stampare l'header html e la navigazione
HtmlHeader();
Navigation();
//Scriviamo qualcosa
echo '<br><br>
<h1>Benvenuto nella rubrica</h1>
';
//infine stampiamo il footer html
HtmlFooter();
?>
Se provate ad eseguire questo file vedrete che nella navigazione “home” non viene scritto come
link. ATTENZIONE, se avete un editor come il mio che lavora con i file temporanei, dovrete
invocare l’index.php direttamente nel browser per vedere questo risultato

27 La connessione al database

La connessione php-MySQL con MySQLi
Premessa
Lo scenario che si intende alla base di questo capitolo è di disporre di un ambiente phpmysql rappresentato nel seguente schema:
L'applicazione php viene eseguita dal server web, per accedere a un database deve
essere attivata una connessione con il server MySql.
Presentiamo qui l'estensione MySQLi (MySQL Improved Extension) che quindi è una
estensione 'migliorata' rispetto alla precedente 'MySQL Extention'.
Obiettivo di queste enstensioni è di fornire strumenti di accesso a DataBase ad alto livello,
senza cioè dover implementare il protocollo di comunicazione fra client (php) e server
(MySQL).
La release MySQLi qui presentata offre strumenti orientati allo sviluppo ad oggetti che
invece erano assenti nella precedente.
Per garantire compatibilità con la grossa mole di software già esistenti sviluppati secondo
il paradigma procedurale in realtà anche MySQLi offre delle funzioni di tipo procedurale,
pertanto nelle pagine di manuale si trovano sempre doppia indicazione:
● object oriented syle: l'implementazione orientata agli oggetti, a cui qui facciamo
riferimento
● procedural style: l'implementazione procedurale che qui tralasciamo.
Inoltre segnalo che in rete si trovano moltissimi esempi di script php che accedono a data
base la maggior parte dei quali sono sviluppati seguendo il modello procedurale, per cui
raccomando attenzione per non perdersi in ibridi procedural-oggetto che sconsiglio.

La classe MySQLi
Gli oggetti di questa classe hanno il compito di rappresentare la connessione fra php e un
database MySQL.

Connessione al database
La funzione di connessione è associata all'istanza dell'oggetto, quindi è compito del
costruttore della classe l'attivazione della connessione ( vedi
http://it.php.net/manual/en/mysqli.construct.php ).
Il costruttore ha dunque bisogno di quattro informazioni basilari:
● host in cui risiede il server MySQL a cui connettersi
● username
● password
● database identifier
che devono essere passate come parametro all'istanziazione dell'oggetto.

--- ---

La connessione php-MySQL con MySQLi

Esempio:
$db=new MySQLi('localhost','root','','ilmiodb');
Come si vede i quattro parametri sono stringhe, nell'esempio si indica che il server mysql
risiede sullo stesso host del server web-php, le credenziali di accesso sono per utente root
privo di password (cosa frequente in macchine di sviluppo, ma totalmente errate su un
server in produzione!) e il database ha identificatore 'ilmiodb'.

Classe di connessione personalizzata
In base a quanto visto l'istanza di un oggetto di classe MySQLi produce la connessione al
database. In una applicazione web tipicamente sono presenti molti script php ognuno dei
quali avrà necessità di accedere al database, pertanto in ognuno verrà istanziato un
oggetto per la connessione fornendo ogni volta i parametri adeguati.
Punto debole di questa situazione è che se c'è bisogno di modificare un parametro di
connessione (ad esempio la password) sarà necessario effettuare la modifica in tutte le
occasioni in cui è prevista la connessione. Per questo motivo invece che specificare i
parametri ad ogni esigenza di istanza di connessione può essere più efficace definire una
propria classe di connessione che estende MySQLi su cui si ridefinisce il costruttore con i
parametri impostati, ad esempio:
//file ConnessioneDb.php
class ConnessioneDb extends MySQLi{
function __construct() {
parent::__construct('localhost','root','','ilmiodb');
}
}
I vari script dell'applicazione potranno ottenere la connessione istanziando un oggetto di
classe ConnessioneDb senza specificare parametri. Qualora uno dei parametri dovesse
essere modificato andrà ritoccato il solo costruttore della classe ConnessioneDb e tutti gli
script dell'applicazione saranno implicitamente aggiornati.

Query
Il metodo query consente l'invio al dbms di un comando, con la conseguente esecuzione e
ottenimento del risultato.
mixed query ( string $query [, int $resultmode =
MYSQLI_STORE_RESULT ] )
Il parametro stringa $query rappresenta il comando da inviare al dbms, sarà in generale
un comando SQL.
Il secondo parametro opzionale al momento lo tralasciamo (assumerà quindi il suo valore
di default)
Il valore di ritorno del metodo sarà:


in caso di fallimento della query viene restituito il valore false

--- ---

La connessione php-MySQL con MySQLi


•in caso di successo della query viene restituito:
◦ se la query è del tipo SELECT, SHOW, DESCRIBE, EXPLAIN un oggetto di
classe MySQLi_Result
◦ negli altri casi valore true

Si rimanda al paragrafo seguente il dettaglio sulla classe mysqli_result
Esempio di uso:
$db=new ConnessioneDb();
$ris = $db->query("SELECT * FROM rubrica");

La classe MySQLi_Result
Un oggetto di questa classe rappresenta la tabella risultato ottenuta da una query. Su
questa tabella l'oggetto tiene un riferimento (cursore) ad una particolare riga, che
chiamiamo riga corrente. All'istanza dell'oggetto la riga corrente è la prima.
La riga indirizzata dal cursore può essere accessibile con più di una modalità, qui per ora
ne prendiamo in esame una.

Metodo fetch_assoc()
Questo metodo restituisce la riga corrente del risultato come array associativo in cui le
chiavi sono costituite dagli identificatori di colonna della tabella risultato. Inoltre il cursore
vine spostato alla riga seguente (se disponibile). Se il cursore è a fine tabella il metodo
retituisce NULL.
Esempio
$db=new ConnessioneDb();
$ris = $db->query("SELECT * FROM rubrica");
$riga = $ris->fetch_assoc();
// $riga è un array che contiene:
// 'nome'=>'Mario', 'cognome'=>'Rossi', 'telefono'=>'0512345678'
Frequentemente si ha interesse a scandire l'intera tabella risultato, pertanto questa
istruzione viene inserita in un ciclo controllato dal confronto con il valore NULL che indica il
raggiungimento di fine tabella.
Esempio:
while ( ($riga=$ris->fetch_assoc()) !== NULL ) {
// elaboro $riga secondo la finalità specifica dell'applicazione
}

Attributo num_rows
Questo attributo contiene il numero di righe della tabella risultato

--- ---

La connessione php-MySQL con MySQLi


Esempio: visualizzazione dei dati di una tabella
Ecco un esempio di come possa essere eseguita la connessione, query e visualizzazione
dei dati del risultato.
require_once "ConnessioneDb.php";
$db=new ConnessioneDb();
$ris = $db->query("SELECT * FROM rubrica");
echo "La rubrica contiene {$ris->num_rows} contatti<br>\n";
while ( ($riga=$ris->fetch_assoc())!=NULL) {
echo "{$riga['nome']} {$riga['cognome']} {$riga['telefono']}
<br>\n";
}

Gestione degli errori
Partiamo dell'esempio del paragrafo precedente, in particolare le due righe che eseguono
connessione/query:
$db=new ConnessioneDb();
$ris = $db->query("SELECT * FROM rubrica");
e poniamoci l'obiettivo di verificare che ognuna di queste due abbia avuto successo. Se
infatti per qualche motivo fallisce la connessione non ha senso tentare di eseguire una
query. In modo simile se fallisce l'esecuzione di una query non ha senso trattare il risultato.

Errore di connessione
La classe MySQLi rende disponibile l'attributo
connect_error
che contiene:
•in caso di successo nella connessione il valore NULL

•in caso di errore una stringa con messaggio che descrive l'errore riconosciuto

Quindi ecco una possibile applicazione:
$db=new ConnessioneDb();
if ($db->connect_error){
//connect_error non ha valore null, quindi c'è stato errore di
connessione
die('Connection failed: '.$db->connect_error);
}
Si noti l'uso del die che interrompe l'esecuzione dello script, infatti avevamo già osservato
che in assenza di connessione non ha senso proseguire.

Errore su query
La classe MySQLi rende disponibile l'attributo
error
In modo simile a quanto visto prima questo attributo riporta informazioni su condizioni di
errore, in particolare si riferisce all'esito della più recente esecuzione di un metodo della
classe (che non sia il costruttore).
L'atttributo contiene:
--- ---

La connessione php-MySQL con MySQLi


•in caso di successo una stringa vuota

•in caso di errore una stringa con messaggio che descrive l'errore riconosciuto

Quindi ecco una possibile applicazione:
$ris = $db->query("SELECT * FROM rubrica");
if ($db->error){
//error non ha stringa vuota, quindi c'è stato errore di query
die('Query failed: '.$db->error);
}
Anche in questo caso il riconoscimento dell'errore viene trattato interrompendo lo script.

Classe di connessione con gestione dell'errore
Nella maggior parte delle applicazioni che prevedono l'accesso a database si ripetono in
vari punti le istruzioni di connessione e/o esecuzione di query, per ognuna di queste è
bene effettuare la verifica .
Possiamo quindi pensare di portare la verifica all'interno della classe di gestione della
connessione e di fatto liberare l'applicazione dall'onere di effettuare la verifica ogni volta.
class ConnessioneDb extends MySQLi{
function __construct() {
parent::__construct('localhost','root','','rubrica');
if ($this->connect_error){
die('Connection failed: '.$this->connect_error);
}
}
function query($query) {
$ris=parent::query($query);
if ($this->error){
die('Query failed: '.$this->error." query='$query'");
}
return $ris;
}
}

28 Pensare ad oggetti

Pensare ad oggetti
PREMESSA: In questa sezione del corso tratterò la programmazione ad oggetti così come
supportata nelle versioni 5.x di PHP.
Iniziamo oggi l’affascinante capitolo della programmazione orientata agli oggetti. Chi di voi ne
ha sentito parlare ma non ne è mai entrato in contatto avrà diverse aspettative, per cui chiarisco
subito alcuni punti.
La programmazione ad oggetti non ci permette di fare di più. Quello che facciamo con il
paradigma ad oggetti lo possiamo fare con il paradigma procedurale. Si tratta unicamente
di un modo diverso di scrivere il codice, direi che concettualmente è un modo molto diverso.
Questo modo diverso di scrivere ed organizzare il codice è più complesso ma ci garantisce
una grandissima chiarezza, un’elevatissima estendibilità ed una lunga serie di vantaggi che
scoprirete.
Inoltre saremo costretti a spendere più tempo in fase di progettazione, cosa che si rivelerà
positiva. Se volessi descrivere la mia giornata odierna con un paradigma procedurale (quello
che abbiamo utilizzato fino ad ora) farei qualcosa del genere: Mi sono alzato, ho fatto colazione,
ho vestito mio figlio, l’ho portato all’asilo, sono andato a fare la spesa, ho pranzato, ho cenato,
ho fatto la doccia, ho guardato la televisione, sono andato a dormire.
Con il paradigma procedurale descriviamo una serie di procedure appunto che si svolgono i
sequenza. Se volessi descrivere la mia giornata con un paradigma ad oggetti dovrei fare un
ragionamento un po’ più ampio. Credo che inizierei con pensare ad un elemento che sia il più
generale possibile e che contenga di conseguenza quelle azioni che svolgo certamente ogni
giorno. Questo elemento lo chiamerò classe mentre le azioni le chiamerò metodi. Definirò
quindi la classe Giornata(), che sarà la classe generale contenente i metodi che rientrano nella
casistica generale di tutte o quasi tutte le mie giornate. In questa classe definirò quindi diversi
metodi: Mangiare(), Lavarsi(), Alzarsi(), AndareADormire(), Bere(), ecc… Queste sono azioni
che svolgo ogni giorno. Potrei domandarmi anche che varianti possono avere queste azioni. Ad
esempio Mangiare() cosa? A che ora? Queste varianti le chiamerò proprietà.
Ora a partire da questa classe generale potrò creare delle estensioni (child) più specifiche. Le
estensioni della mia classe principale (parent) ereditano tutti i metodi e le proprietà. Potremo
inoltre definire dei metodi più specializzati o ridefinire dei metodi esistenti.
Dunque scriverò ad esempio la classe Lunedì() come estensione della classe Giornata() che
conterrà il metodo Spesa() e il metodo PortareFiglioAllAsilo() (Cose che faccio solo il lunedì).
Questa classe, senza bisogno di riscriverli, conterrà anche i metodi e le proprietà della classe
parent (Giornata()). Potrò dunque utilizzare l’estensione Lunedì() per descrivere la mia giornata
odierna non dovendomi più preoccupare di dover ridefinire ad esempio il metodo Mangiare().

Pensate ora all’applicazione che abbiamo realizzato nel capitolo precedente. Ogni modulo
potrebbe essere un metodo e questi metodi fare parte di una classe. In questa classe avremmo
quindi descritte tutte le procedure che servono a far funzionare la nostra applicazione. La
possiamo includere in ogni pagina con il vantaggio di tenere separate queste procedure dallo
svolgimento logico del codice. Il modulo di cancellazione potrebbe avere ad esempio questo
aspetto:
Delete($_GET['id']);
header(“Location: showall.php”);
Ovviamente il metodo Delete() conterrà le procedure che si occupano della connessione al
database come pure le procedure per la cancellazione del record. Ma questo non ci interessa,
a noi interessa unicamente lo svolgimento logico del codice che in questo caso è: Cancella il
record con questo id e mandami alla pagina showall.php. Questo è un esempio semplicissimo,
ma immaginate un codice molto complesso.
Utilizzando il paradigma ad oggetti questo codice risulterà molto più semplice da modificare sia
nella logica che nelle procedure, avrà una struttura chiara e coerente e sarà estendibile. Per
questi motivi le grandi applicazioni sono scritte ad oggetti.
Immaginate la realizzazione di un videogioco ad esempio. Vi sarà una classe che gestisce i
personaggi in senso generale. Tutti i personaggi muoiono se la loro energia scende sotto il
10, possono saltare, se uccidono un nemico guadagnano 10 punti, se distruggono un edificio
guadagnano 50 punti, eccetera. Ognuna di queste caratteristiche sarà gestita da un metodo
della classe personaggi(). Ogni programmatore del team avrà poi il compito di sviluppare un
personaggio che sarà un’estensione della classe personaggi(). Tutti i personaggi del videogioco
avranno quindi una coerenza strutturale derivata dall’aver ereditato le caratteristiche generali
dalla classe parent, poi ovviamente ogni personaggio potrà avere le proprie particolarità, il
proprio vestito, una mossa segreta particolare, un arma speciale.
Penso che a questo punto cominciate ad intravvedere come la programmazione ad oggetti
richieda un maggiore sforzo in fase di progettazione ma infine ci ripaga con un codice più
elegante, più semplice da gestire, da modificare e da estendere e, se ben scritto, altamente
riutilizzabile.

29 Classi, oggetti, metodi e proprietà

Classi, metodi e proprietà
Iniziamo subito a stampare Hello World con la programmazione ad oggetti.

<?php
class HelloWorld
{
public $saluto;
public function __construct()
{
$this->saluto = "Hello World";
}
public function Saluta()
{
echo $this->saluto;
}
}
$obj = new HelloWorld();
$obj->Saluta();
?>

Avrei potuto fare in diversi altri modi, ho scelto questo in quanto è il più esplicativo visto che
contiene tutti gli elementi principali. Vediamo quanto fatto passo dopo passo.
Le classi si dichiarano con la keyword “class” seguita dal nome della classe. In seguito andremo
a dichiarare le proprietà. Nel nostro caso abbiamo un’unica proprietà ($saluto) con visibilità
“public”. Esistono tre livelli di visibilità: public, protected e private. Tratterò approfonditamente
il significato di questi attributi nel capitolo relativo all’incapsulamento. Per il momento
dichiareremo tutte le proprietà e tutti i metodi come public.
I metodi si dichiarano con la keyword “function” e si comportano proprio come una funzione.
Possiamo passare degli argomenti, degli argomenti facoltativi e possiamo farci ritornare un
valore con “return”.

Il primo metodo è un metodo speciale e lo dichiariamo con il nome riservato __construct.
Si tratta del metodo costruttore la sua particolarità sta nel fatto che viene eseguito
automaticamente quando la classe viene istanziata (cosa significa istanziare la classe lo
vedremo tra poco). Potremmo quindi dire che il costruttore è una sorta di inizializzazione. Nel
nostro caso valorizziamo semplicemente la proprietà $saluto.
Per accedere ai metodi e alle proprietà della classe, dobbiamo utilizzare la variabile magica
$this seguita da ->.
In seguito dichiariamo il metodo Saluta() che semplicemente ci stamperà la proprietà che
abbiamo valorizzato.
A questo punto la nostra classe va attivata o come si dice in gergo istanziata; per essere
utilizzata infatti, dobbiamo creare un’istanza, nel nostro caso $obj. La sintassi come vedete è
$obj = new NomeClasse.
Ora grazie alla nostra istanza possiamo accedere ai metodi ed alle proprietà della classe.
Potremmo stampare Hello World anche eliminando
$obj->Saluta();
e sostituendolo con
echo $obj->saluto;
In questo caso invece che eseguire il metodo Saluta(), abbiamo stampato la proprietà saluto.
Possiamo anche valorizzare le proprietà da fuori la classe. Se ad esempio sostituite le ultime
righe del codice in questo modo

$obj = new HelloWorld();
$obj->saluto = "ciao mondo";
$obj->Saluta();

In questo caso il costruttore valorizza saluto con Hello World, ma subito dopo rivalorizziamo
saluto con ciao mondo. Al momento di eseguire il metodo Saluta() la proprietà saluto è
valorizzata con ciao mondo ed è quello che stamperà.
Facciamo un altro esempio. La nostra classe ora deve stampare Hello World o Ciao Mondo a
dipendenza del parametro che passiamo (it o en).

<?php

class HelloWorld
{
public $saluto;
public function __construct($lang)
{
switch($lang)
{
case "en":
$this->saluto = "Hello World";
break;
case "it":
$this->saluto = "Ciao mondo";
break;
}
$this->Saluta();
}
public function Saluta()
{
echo $this->saluto;
}
}
$obj = new HelloWorld("en");
?>

Come vedete passo al costruttore l’argomento $lang. Con switch verifico: se è “en” valorizzo
la proprietà con Hello World mentre se è “it” con Ciao Mondo. Infine, sempre nel costruttore,
eseguo il metodo Saluta() direttamente. Questo vuole dire che semplicemente istanziano la
classe (e naturalmente passando l’argomento en o it) mi verrà stampato il saluto.

30 Ereditarietà

L’ereditarietà
Una delle proprietà più “succose” della programmazione orientata agli oggetti é certamente
l’ereditarietà. Con questo termine intendiamo la possibilità di creare una classe “fotocopia” di
un’altra classe, ma con la possibilità di aggiungere o modificare parte di essa. Ma passiamo
subito alla pratica che é notoriamente più chiarificatrice della teoria.
Prendiamo ad esempio l’ultima classe che abbiamo visto nel capitolo precedente.
<?php
class HelloWorld
{
public $saluto;
public function __construct($lang)
{
switch($lang)
{
case "en":
$this->saluto = "Hello World";
break;
case "it":
$this->saluto = "Ciao mondo";
break;
}
$this->Saluta();
}
public function Saluta()
{
echo $this->saluto;
}
}
$obj = new HelloWorld("en");
?>
Come ricorderete questa classe stampa un saluto personalizzato a dipendenza del parametro
passato al costruttore. Diciamo ora che in alcuni casi vorrei utilizzare questa classe ma mi

servirebbe che il saluto fosse stampato con un carattere grande. Badate che é un esempio
stupido, la vera utilità di quanto stò dicendo la si vede in grandi applicazioni!
Ho due possibilità: Riscrivo la classe formattando l’output nel metodo Saluta(), oppure scrivo
un’estensione della classe, in questo modo:
<?php
class HelloWorldSalutoFormattato extends HelloWorld
{
public function Saluta()
{
echo "
<h1>" . $this->saluto . "</h1>
";
}
}
?>
Come vedete la sintassi é:
class -nome classe figlia (chid)- extends -nome classe che va estesa (parent)Ora in questa nuova classe abbiamo tutti i metodi e le proprietà della classe parent.
Dichiarando in metodo Saluta (che già esiste nella classe parent), indichiamo che vogliamo
riscrivere questo metodo.
Ora quando ci servirà il testo del saluto formattato non ci resterà che istanziare la classe figlia:
$obj = new HelloWorldSalutoFormattato("en");
Oltre ad avere la possibilità di riscrivere metodi e proprietà, possiamo anche dichiararne di
nuovi.
<?php
class HelloWorldSalutoFormattato extends HelloWorld
{

public $text = "...";
public function Saluta()
{
echo "
<h1>" . $this->saluto . "</h1>
";
}
public function AddText()
{
echo $this->text;
}
}
?>
In questo caso dichiariamo una nuova proprietà ($text) e un nuovo metodo (AddText()).
Ora istanziando la nostra estensione in questo modo
$obj = new HelloWorldSalutoFormattato("en");
$obj->AddText();
Quello che ci comparirà a video sarà

Hello World…
Ripeto, l’esempio non rende la potenzialità di questa procedura. Ma provate ad immaginare
quello che dicevo nel capitolo introduttivo; la realizzazione di una grande applicazione come ad

esempio un gioco elettronico. La grande utilità della programmazione ad oggetti non può essere
colta immediatamente, ma immagino che cominciate ad intuire che non si tratta proprio solo di
un’operazione di facciata o un modo un po’ bizzarro di scrivere il codice.

31 Incapsulamento dei metodi e delle proprietà

Incapsulamento dei metodi e delle proprietà
Trattiamo brevemente l’argomento relativo a quella che viene definita la “visibilità”.
Fino ad ora abbiamo dichiarato come “public” tutti i metodi e le proprietà delle nostre classi. In
effetti esistono altri due livelli di visibilità che sono “protected” e “private”.
Public: Con questo attributo dichiariamo i metodi e le proprietà che vogliamo siano visibili
anche all’esterno della classe.
Private: Con questo attributo dichiariamo i metodi e le proprietà che vogliamo siano visibili solo
all’interno della classe nella quale sono dichiarati.
Protected: Con questo attributo dichiariamo i metodi e le proprietà che vogliamo siano visibili
solo nella classe all’interno della quale sono dichiarati e nelle classi figlie.
Facciamo un esempio
class Genitore
{
public $var1;
protected $var2;
private $var3;
public function Metodo1()
{
}
protected function Metodo2()
{
}
private function Metodo3()
{
}
}
class Figlia extends Genitore
{
//.....
}
$var1 é accessibile nella classe Genitore e nella classe Figlia come pure all’esterno della classe
dopo che essa é stata istanziata, ad esempio

$obj = new Genitore();
$obj->var1 = 12;
$var2 é accessibile unicamente nella classe Genitore e nella classe Figlia. Questo codice:
$obj = new Genitore();
$obj->var2 = 12;
Produrrà un Fatal Error.
$var3 é accessibile unicamente nella classe Genitore.
Lo stesso discorso vale per i metodi:
$obj = new Genitore()
$obj->Metodo1();
Questo codice funzionerà, ma:
$obj = new Genitore()
$obj->Metodo2();
//oppure
$obj = new Genitore()
$obj->Metodo3();
Questi codici produrranno un Fatal Error, Come pure il tentativo di utilizzare o riscrivere
Metodo3() nella classe Figlia.
Queste procedure hanno un’utilità per la chiarezza del codice e per evitare pasticci. Se non
abbiamo bisogno di accedere ad un metodo o a una proprietà dall’esterno della classe,
dichiariamoli come minimo “protected”. Questo eviterà spiacevoli intoppi, in particolare quando
l’applicazione inizia a crescere o quando ci sono molte persone che maneggiano la classe.
Un’ultima cosa. E’ possibile che sia necessario dover utilizzare un metodo o una proprietà
all’esterno della classe, ma che contemporaneamente non vogliamo che questa venga riscritta
in un’eventuale estensione. Non possiamo dichiararla come private altrimenti non sarebbe più
visibile all’esterno. In questo caso ci viene in aiuto l’attributo final. Utlizzandolo impediamo che
un metodo venga riscritto anche se dichiarato come pubblico.
public final function Metodo()
{
}

Questo metodo sarà utilizzabile all’esterno della classe ma non riscrivibile in una sua
estensione.
Ovviamente una cosa del genere non ha nessun senso
private final function Metodo()
{
}