La seconda parte di un corso di programmazione coincide spesso con l’analisi delle strutture.
Variabili, tipi, oggetti, array, casting… tutti concetti utili ma che, introdotti nel momento sbagliato, diventano controproducenti.
Ho visto diversi aspiranti programmatori chiudere il libro alla seconda lezione; altri, più volenterosi, andare avanti sapendo che di quanto letto era stato assorbito ben poco.
E’ sconcertante il fatto che la quasi totalità dei manuali utilizzi questo approccio: bombardare il lettore di concetti teorici (alcuni dei quali saranno poi utilizzati raramente) con il risultato di disorientarlo.
E’ come se, in un cantiere, venisse insegnata ad un manovale la composizione chimica del cemento e della malta, pretendendo poi che grazie a quei concetti costruisca un muro.
Non saprebbe da quale parte iniziare: proprio come molti volenterosi programmatori quando leggono un libro poco chiaro.
Un giorno capitò tra le mie mani un manuale usato nei college americani sul linguaggio JAVA (non Javascript).
Adottava un approccio rivoluzionario (almeno per il tipo di manuali che siamo abituati a trovare in Italia): alla seconda lezione, senza neanche nominare la parola “variabile”, rendeva lo studente in grado di aprire, modificare, eliminare o creare file di testo!
Credo che, usando questa metodologia, sia più semplice spiegare concetti come “condizione”, “ciclo”, “costante”, “funzione”.
A ben vedere, la programmazione per computer altro non è che il trasferimento su macchina delle operazioni che – il più delle volte inconsciamente – compiamo nella vita di tutti i giorni. Un approccio pratico rende quasi spontanee domande e risposte.
Questo sarà il filo conduttore delle nostre lezioni.
Impariamo a programmare: analisi del problema
Tanto per iniziare, elaboreremo uno script che darà il benvenuto agli utenti del nostro sito, presentando l’intestazione in colore diverso a seconda del giorno della settimana. Grazie a questo script, prenderemo un’efficace familiarità con le variabili.
L’output (il risultato) del nostro programmino dovrà essere qualcosa del genere:
Benvenuto nel mio sito! Oggi è <giorno della settimana> |
Testo del sito |
Dove il <giorno della settimana> e il colore dello sfondo cambiano a seconda del calendario.
Ipotizziamo quindi di voler dare il benvenuto ai visitatori del nostro sito nel seguente modo:
Giorno | Colore sfondo |
Lunedì | Benvenuto nel mio sito! Oggi è Lunedi! |
Martedì | Benvenuto nel mio sito! Oggi è Martedì! |
Mercoledì | Benvenuto nel mio sito! Oggi è Mercoledì! |
Giovedì | Benvenuto nel mio sito! Oggi è Giovedì! |
Venerdì | Benvenuto nel mio sito! Oggi è Venerdì! |
Sabato | Benvenuto nel mio sito! Oggi è Sabato! |
Domenica | Benvenuto nel mio sito! Oggi è Domenica! |
Il primo passo da muovere per creare uno script o un programma è focalizzare il problema.
In questo senso, abbiamo già fatto qualcosa: abbiamo visualizzato qui sopra l’output, il risultato atteso.
Può sembrare paradossale partire… dalla fine, ma senza conoscere precisamente l’obiettivo diventa arduo muoversi nella giusta direzione.
Analisi delle risorse
Cosa occorre per realizzare il nostro progetto? Cosa sappiamo già fare? Come potremmo ottenere le informazioni mancanti?
Per creare delle celle colorate è sufficente del semplice HTML. Credo che tutti i lettori di questa guida sappiano creare una tabella e usare l’attributo bgcolor e/o i CSS.
Il problema è che l’HTML può solo visualizzare a video informazioni, ma non può sapere “che giorno è oggi” e cambiare di conseguenza i colori di una tabella. Occorre un linguaggio di programmazione.
Javascript potrebbe fare a caso nostro: in effetti riuscirebbe nello scopo, ma presenterebbe la limitazione di cui parlavamo nella prima lezione. Si tratta infatti di un linguaggio lato client, per cui restituirebbe la data del pc dell’utente.
A volte accade che il computer visualizzi l’ora sbagliata, o che l’orologio del sistema sia indietro per problemi di batteria.
PHP è l’ideale: gira sul server (e l’ora del server dovrebbe essere sempre esatta…), offre funzioni di gestione delle date e può interagire tranquillamente con l’HTML.
Per quanto visto nella prima lezione, a questo punto potremmo giù incontrare delle difficoltà: quali sono le funzioni di gestione delle date? E come può PHP cambiare il codice html di una pagina?
Iniziamo dalla seconda domanda. Nella prima lezione abbiamo stampato a video la semplice frase “Hello world”.
Ma se avessimo scritto:
echo “<b>Hello world</b>”;
?>
cosa avremmo visto? La scritta “Hello world“, in grassetto.
Infatti PHP, più che a stampare sul video una frase, la va a scrivere direttamente nel codice html.
Provate a riprendere il file creato nella prima lezione e a correggerlo inserendo i tag di grassetto come nell’esempio qui sopra. Andate ad eseguire il file e guardate il codice html della pagina: non c’è traccia dell’istruzione php, ma solo il suo risultato: “<b>Hello world</b>”, appunto.
La nostra riga di codice viene interpretata e passata al browser come un normale comando HTML.
A questo punto, sappiamo come creare delle tabelle con PHP: invece dei tag di formattazione testo, basterà inserire i comandi di gestione delle celle.
Restano due problemi: risalire al giorno corrente (sapere se oggi è domenica, martedi ecc.) e far capire a php che deve stampare una cella di colore diverso.
Abbiamo visto nella lezione precedente una funzione predefinita del linguaggio PHP: echo. Questa funzione riceve come parametro (tra doppi apici) una stringa e la inserisce nel codice html della pagina.
N.B.: è possibile usare anche apici singoli per stampare una stringa, ma con delle limitazioni che vedremo successivamente.
PHP dispone di centinaia di funzioni predefinite. Tra queste una, date(), fa al caso nostro.
date() riceve come parametro (tra parentesi, e non tra doppi apici: tutte le funzioni usano questa sintassi, echo”” è un’eccezione) il formato della data. Una data può infatti essere espressa come “1/2/2004”, oppure come “2/1”, o come “1/2/2004, 16:08”.
Con la funzione date(“j/n/Y”), viene ad esempio restituita la stringa “1/2/2004”.
Apriamo una breve parentesi, visto che vorrete di sicuro provare la funzione date().
La funzione non fa altro che restituire una stringa, ma per stamparla avremo bisogno ancora della funzione echo.
In un file .php dovremo quindi inserire una riga di codice come questa:
echo “oggi è: ” . date(“j/n/Y”);
?>
per stampare in html la data. L’operatore “.” concatena due stringhe: la prima, “oggi è”, definita da noi; l’altra, la data odierna, restituita dalla funzione php date().
Per ottenere il giorno della settimana corrente, dovremo usare il parametro “w”:
echo “oggi è: ” . date(“w”);
?>
Viene restituito 0 se oggi è domenica, 1 se è lunedi, 2 se è martedi e cosi via.
Torniamo al nostro problema. Sappiamo come creare una tabella, sappiamo come crearla in php, sappiamo che con php possiamo risalire al giorno della settimana odierno… manca il modo di coniugare queste informazioni.
Struttura logica di uno script
Analizzato il problema, il passo successivo è quello di creare la struttura logica.
Dobbiamo dire al nostro interprete php qualcosa del genere:
se oggi è domenica, colora lo sfondo di giallo;
se oggi è lunedi, colora lo sfondo di verde;
se oggi è martedi, colora lo sfondo di blu;
e cosi via.
I moderni linguaggi di programmazione usano una sintassi molto simile a quella della lingua parlata (inglese, ovviamente):
if(condizione){
comportamento
}
Quindi, avvicinandoci al PHP:
if(oggi è domenica){
colora lo sfondo di giallo;
}
if(oggi è lunedi){
colora lo sfondo di verde;
}
Andiamo, come in un’equazione, a sostituire alla struttura logica le istruzioni PHP.
Come vedete, abbiamo inglobato l’istruzione PHP dentro una normale tabella html. Il risultato dell’istruzione php sarà comunque codice che il browser interpreterà normalmente.
Salvate il file dentro la root, come mostrato nella prima lezione di questo corso, ed eseguite il file. Ricordate di salvare sempre con estensione .php, altrimenti il codice non verrebbe interpretato.
Vi consiglio, fin d’ora, di strutturare in cartelle la root, altrimenti ben presto vi trovereste con decine di file senza ordine.
Potete creare nuove cartelle, e poi raggiungerle con il percorso completo.
Ad esempio, creiamo una cartella “lezione2” per contenere questo file (chiamiamolo, arbitrariarmente, “tabella.php”).
Per raggiungere il nostro script via browser digitiamo:
http://localhost/lezione2/tabella.php
Diamo uno sguardo al codice. Abbiamo introdotto dei concetti nuovi, oltre all’istruzione “echo” che già conoscevamo.
Abbiamo preso familiarità con le strutture condizionali:
if(condizione){
comportamento;
}
La parola “if” (“se”), le parentesi tonde sulla condizione e le parentesi graffe che delimitano il comportamento sono costanti di qualsiasi linguaggio C-Like.
All’interno delle parentesi graffe possiamo digitare più istruzioni (purchè delimitate sempre dal punto e virgola, una per riga).
Dentro le parentesi tonde va di solito inserita un’espressione che restituisce un valore vero o falso. “(se oggi è domenica)” è una di queste espressioni: sarà vera (in quel caso il programma eseguirà le istruzioni contenute nelle parentesi graffe successive) o falsa (in quel caso lo script andrà oltre).
L’operatore “==” verifica l’uguaglianza tra due valori. Attenzione a non utilizzare il singolo “=”, perché serve a tutt’altro (assegna un valore ad una variabile, come vedremo tra poco).
Miglioriamo il codice creato
Lo script funziona ma va migliorato.
Guardate bene il codice scritto sopra. Ipotizziamo che oggi sia domenica: se è verificata quindi la prima condizione, che senso ha controllare le altre?
Ovviamente, oggi non può essere sia domenica che giovedì… bisogna far capire al programma che, quando trova il giorno odierno, deve fermarsi e non controllare le condizioni successive.
PHP mette a disposizione un altro operatore, else if (“altrimenti, se.. “) che fa al caso nostro. Riscriviamo lo script precedente con questa piccola correzione:
Credo non ci sia bisogno di ulteriori commenti: se è verificata la prima condizione, il programma stampa il codice relativo alla domenica. Il resto non viene eseguito perché, essendo verificato il primo “se(condizione)”, non esiste un “altrimenti se..”.
Se oggi è venerdi, abbiamo comunque risparmiato l’ultima verifica.
Nel primo script elaborato, invece, venivano verificate sempre tutte le 7 condizioni, perché non avevamo indicato un “altrimenti” e quindi potevano essere -teoricamente- vere tutte quante.
Possiamo far di meglio.
Vi sarà sicuramente capitato di non sapere il giorno della settimana. Cosa fate? Guardate l’orologio, o avvicinate il mouse sopra l’ora segnata da windows in attesa del box di data.
Se dopo un po’ un vostro collega vi chiede il giorno, non andate a ripetere l’operazione fatta prima. Una volta vista la data nell’orologio, questa rimane memorizzata nel vostro cervello e potete rispondere immediatamente alla domanda del vostro collega.
Nello script elaborato in precedenza abbiamo invece fatto ricorso sempre alla funzione date(). E’ come se avessimo detto a PHP “vedi che data è oggi, e poi vedi se è domenica”, “vedi che data è oggi, e poi vedi se è lunedi”.
Ogni volta PHP è costretto a richiamare la funzione date(), per risalire sempre allo stesso valore ritornato.
Se la nostra mente riesce a riservare un’area di memoria per ricordare, una volta per tutte (almeno fino a domani), la data odierna, perché non dovrebbe farlo un computer?
Senza volerlo (ecco l’utilità dell’approccio pratico), siamo arrivati a parlare delle variabili.
Una variabile è una “scatola”, un contenitore, un’area di memoria destinato a conservare un valore per l’utilizzo durante il programma. L’utilità delle variabili emerge quando un valore deve essere utilizzato più volte (come il risultato di date() nel nostro caso), o quando serve un appoggio per memorizzare informazioni per delle istruzioni.
Le variabili in PHP devono sempre iniziare con il segno di “dollaro” ($), e devono essere seguite almeno da una lettera o da un underscore (trattino basso “_”).
Per inserire un valore in una variabile viene usato il segno di “=” singolo (con il doppio “==” eseguiamo invece dei confronti, ricordate?)
A differenza di altri linguaggi, nella programmazione di base di PHP non necessitiamo di una dichiarazione esplicita delle variabili, cosa che avviene nella creazioni di classi con le ultime versioni di PHP.
Quando ne occorre una, basta utilizzarla (come in Javascript) e php destinerà un’area di memoria automaticamente.
Rivediamo allora il nostro script utilizzando una variabile per memorizzare il risultato di “date()”:
Precisazioni e… compito a casa
Notate che nell’ultimo caso (il sabato) ho sostituito l’elseif con un normale else (“altrimenti”).
Intuite il motivo? Non ha senso dire “altrimenti, se oggi è sabato..” quando siamo arrivati all’ultima condizione.
Se siamo arrivati a quel punto, vuol dire che le precedenti 6 erano tutte false, e se un giorno della settimana non è domenica, non è lunedi, non è martedi, non è mercoledi, non è giovedi, non è venerdi… non occorre verificare “altrimenti se oggi è sabato”.
I lettori più esperti saranno in grado di migliorare ulteriormente il codice proposto (con costanti, switch, array…) ma sarebbe stato controproducente mettere troppa carne sul fuoco in questa lezione, nella quale abbiamo introdotto concetti come condizioni e variabili.
Vi lascio con un paio di precisazioni
Possibile ovviamente utilizzare variabili all’interno di stringhe.
Provate questo script:
È consigliabile, comunque, evitare di inserire le variabili direttamente nelle stringhe, per vari motivi:
- migliore lettura/pulizia del codice
- minore impegno del motore
- risultati imprevisti (quando usizmo le variabili array)
È buona norma utilizzare la legatura “.” (es: echo “stringa di testo ” . $variabile) oppure racchiudere le variabili tra parentesi graffe (es: echo “stringa di testo {$variabile}”).
Altra precisazione: attenzione ad usare gli apici doppi all’interno di stringhe.
Se andassimo a scrivere un’istruzione del genere:
il motore PHP restituirebbe un errore. Il carattere di doppio apice è infatti il delimitatore di stringa; PHP cercherebbe di interpretare l’istruzione ma si fermerebbe a “maradona è ” perché troverebbe gli apici.
Genererebbe anche un errore perché aspetterebbe il carattere di fine istruzione (il punto/virgola) e troverebbe invece “el pibe”.
Il problema è di facile soluzione: nei linguaggi C-LIKE basta mettere il carattere “\”, detto di “escape”, per avvertire l’interprete che quelle virgolette non sono delimitatori ma parte della stringa stessa.
L’istruzione corretta è quindi:
Infine, un compitino a casa: nello script creato in questa lezione appare la stessa frase 7 volte, “ciao!Oggi è…”.
Se volessimo cambiarla con un’altra frase (come “Benvenuto in sito.com, oggi è…”) dovremmo manualmente sostituire 7 volte il parametro della funzione echo.
Visto che abbiamo parlato di stringhe, variabili, possibilità di inserire l’una nell’altra… trovate il modo di scrivere nel programma una sola volta la stringa base, cambiando negli IF soltanto i parametri colore di sfondo e nome-giorno.
Anzi, già che ci siete, divertitevi ad inserire un terzo parametro: il colore del testo, visto che quel nero su blu o su viola si legge ben poco.