Introduzione al linguaggio

Introduzione al corso

Lo scopo principale di questo piccolo corso è quello di aiutare chiunque, anche il meno esperto, ad imparare il PHP. Cercherò di tenere le lezioni come un piccolo discorso informale, evitando grossi giri di parole che potrebbero confondere i meno esperti. Essendo rivolto a tutti anche hai più smanettoni cercherò di inserire più materiale possibile con esempi, qualche piccola "chicca" ogni tanto e magari un esercizio o due da risolvere come a scuola.

Storia del PHP

Il PHP come tutte le cose più utili sono figlie di una necessita, o spesso della pigrizia di un uomo. Il PHP nasce infatti dal bisogno di Rasmus Lerdorf di trovare un metodo semplice e veloce per rendere la sua pagina personale dinamica. Stiamo parlando di circa 10 anni fa, estate del 1994, e il web non era ancora quello che è oggi ma già esistevano le tecnologie per rendere un sito dinamico. Ad esempio tramite le CGI. Sfortunatamente non tutti avevano i mezzi o le conoscenze per mettere mano a codice di eseguibili scritti in C o Perl. Cosi il bravo Lerdorf si invento una serie di macro per facilitare la vita a tutti. Da quel giorno il PHP ha conosciuto una crescita quasi esponenziale, passando da poche migliaia di pagine nel 1996 per arrivare ai giorni nostri con quasi 12 milioni di siti. Ora un piccolo aneddoto sul nome del linguaggio. In origine PHP era l'acronimo di Personal Home page Preprocessor Con il tempo il progetto entro a far parte della comunità open source e il nome venne cambiato in PHP Hypertext Preprocessor rendendolo di fatto un nome ricorsivo.

Cos'è il PHP? Come funziona? Ma soprattutto cosa ci faccio con il PHP?

Queste sono tutte domande lecite per un principiante cominciamo dunque con ordine. Il PHP è un linguaggio usato per fare dello scripting server-side. Lo so che avevo promesso di non usare paroloni ma qui ci stava bene ed in ogni caso ora spiegherò in dettaglio cosa intendevo con questa frase. Il PHP è un linguaggio di programmazione come tutti gli altri, che ha subito delle influenze dal C e dal Perl in maniera particolarmente forte. Presenta, infatti, una sintassi molto simile al C e alcune caratteristiche peculiari del Perl per l'elaborazione delle stringhe. Si tratta però di un linguaggio di scripting perché il codice che scriverete non sarà in alcun modo compilato ma verrà letto da un interprete che si comporterà di conseguenza. Ora cosa intendevo per server-side? Il codice delle vostre pagine PHP verrà letto e interpretato su un server web che potrebbe essere sulla vostra macchina oppure a centinaia di chilometri di distanza. L'elaborazione vera e propria viene dunque fatta da un server il quale invierà il risultante codice HTML al browser che dovrà preoccuparsi solo della visualizzazione della pagina. Concludiamo dicendo cosa si può realizzare con questo linguaggio. Secondo i programmatori di PHP è possibile fare tutto. È ovvio che gli autori tendono ad esagerare un po' sulla loro creatura e che PHP non è il linguaggio definitivo ma è possibile utilizzarlo dalla semplice pagina personale al grande sito di e-commerce.

Server, Editor e programmi vari

Prima di tuffarvi a capofitto nella creazione di siti PHP dovete procurarvi alcuni programmi e server che potrebbero servirvi. Innanzitutto se non disponete di una connessione a banda larga sempre attiva vi tornerà utile avere un server web installato in locale in modo da poter fare delle prove anche quando non siete connessi ad internet. Io consiglio di usare Apache visto che oltre ad essere gratuito è anche il più usato in assoluto su internet. Dopo il server web dovrete procurarvi PHP vero e proprio che potete scaricare dal sito ufficiale. Inoltre potreste avere bisogno di un server per gestire un Database. In questo caso il più conosciuto è senza dubbio MySQL. Ora installare questi programmi non è certo un esperienza piacevole per un principiante, ma anche in questo caso la rete vi viene in aiuto fornendovi progetti come EasyPHP. Questo programma una volta scaricato ed eseguito provvede ad installare e configurare tutto quello di cui avete bisogno per incominciare a scrivere, ponendovi solo alcune semplici domande. Se usate distribuzioni Linux come Debian l'installazione risulta di una semplicità disarmante quindi evito di approfondire ulteriormente. Consiglio chiunque voglia ampliare le proprie conoscenze di provare almeno una volta a configurare il tutto mettendo mano ai vari file di configurazione.

Windows possiede un proprio server web da installare che supporta sia PHP che MySQL. Se non volete usare Apache usate pure IIS ma qui non potrò aiutarvi non avendolo mai usato.

Ora che siete in corsa e i server funzionano non vi resta che munirvi di un buon editor di testi ed incominciare a scrivere finalmente un po' di codice. Io personalmente scrivo le mie pagine PHP su Linux da diverso tempo e utilizzo Emacs. Non voglio obbligarvi ad usare un editor in particolare ma solo darvi alcuni consigli visto che un editor è un po' come un paio di mutande, dovete scegliere quello che vi da meno fastidio. Se vi trovate bene potete usare anche Notepad oppure Wordpad. Mi sento invece di sconsigliare programmi come Frontpage o editor WYSIWYG, che promettono di farvi scrivere un sito senza sapere una riga di HTML, questo perché tendono a creare codice HTML confuso e fuori dagli standard, inoltre il loro supporto al PHP è quasi sempre nullo. Da notare come Dreamweaver della Macromedia sia una piacevole eccezione ma a pagamento. In definitiva cercate un buon editor che evidenzi le parole chiave del PHP, che gestisca l'indentazione e indichi a che linea siete.

Risorse online

Tutti i grandi linguaggi hanno repository online, ovvero grandi depositi in cui vengono immagazzinate tutte le librerie utili ad un programmatore. PEAR è proprio questo e vi assicuro che potete trovarci veramente di tutto. Questo è proprio uno dei grandi punti di forza di PHP, ovvero l'enorme quantità di esempi, script, librerie già pronti online che aspettano solo di essere scaricati. Mi permetto di segnalare due progetti che ritengo veramente unici per completezza e facilità d' utilizzo. Il primo è Smarty un template engine. Mentre il secondo è ADODb una libreria che gestisce connessioni ed interrogazioni a vari DBMS tutti tramite un' interfaccia comune. Inoltre un link che tutti i programmatori di PHP dovrebbero conoscere a memoria ovvero la Documentazione Ufficiale di PHP.

Sintassi del linguaggio

Prima di incominciare a dire come scrivere cicli o funzioni è meglio soffermasi un attimo sulle basi. Come negli sport anche qui i fondamentali sono tutto, potete essere bravi quanto volete ma se non sapete fare un palleggio o un bagher non andrete tanto lontani. Incominciamo con quello che secondo me è uno dei punti che spesso viene ritenuto meno importante ovvero i commenti. Scrivere un buon commento aiuterà sia voi che un' altro programmatore quando dovrà modificare per qualche motivo il vostro codice. Come ho già detto i commenti sono utili anche a voi, questo perché se nel momento in cui state scrivendo il codice sapete benissimo cosa state facendo fra 6 mesi ve lo sarete sicuramente scordati. Alcune linee guida da seguire per scrivere un buon commento sono secondo me: Commentare lo strano e lasciate perdere l'ovvio. Commentare spesso e spiegare chiaramente cosa si sta facendo, se si tratta di una funzione spiegare il significato dei parametri in ingresso e i valori ritornati dalla stessa. Indicare le varie unita di misura se il programma effettua delle elaborazioni su delle misure ed evitare di passare da una lingua ad un' altra. In ogni caso ecco alcuni esempi di commenti da non seguire.

<?php

/* Nani sore ? I do not know. Ma fa tanto figo! */
$a ^= $b ^= $a ^= $b;

/* fa due più due. */
$somma = 2 + 2;

/* somma fluidi potenziali. */
function sumpotentialflow($v, $p, $c, $d)
{
 
}

?>

Il PHP vi consente una grande libertà in fatto di commenti permettendovi di usare vari stili che permettono a chi viene da altri linguaggi di non perdere le proprie abitudini. Potete infatti usare commenti come in Perl, C e C++.

<?php

# Una riga preceduta da un "#" come nel Perl.

// La doppia slash "//" indica un commento come in C++

/* e per finire i commenti multi linea
   come in C */

?>

Ora che abbiamo chiarito come commentare passiamo ad un' altro punto importante ovvero come inserire il codice nelle pagine HTML. L'interprete del PHP richiede che tutto quello che scrivete sia racchiuso tra due tag speciali inseriti tra quelli HTML. Questi tag sono <?php come apertura, e ?> come chiusura. Esistono poi anche altri stili che potremo scegliere per comodità oppure per abitudine personale se venite da altri linguaggi. Ecco un esempio che usa tutti i vari stili di tag accettai dal interprete del PHP.

<?php
/* esempio con i tag standard */
?>

<?
/* tag standard in versione short */
?>

<%
/* versione asp-like dei tag */
%>

<script language="php">
/* versione HTML dei tag */
</script>

I tag standard e la versione HTML sono sempre abilitati e funzionano ovunque mentre i due stili short-tag non lo sono sempre. Nel caso non lo fossero per abilitarli dovrete aprire il file di configurazione di PHP che si chiama php.ini e cercare le opzioni relative a questi tag. Giusto per facilitare chi volesse provare a modificare il file. L'opzione per i tag standard in versione short si chiama short_open_tag. Mentre per la versione asp-like l'opzione si chiama asp_tags.

Passiamo ora a come poter scrivere e fare dell'output nelle vostre pagine altrimenti il PHP sarebbe veramente inutile. Le due funzioni principali per scrivere sono echo e print. Il loro funzionamento è praticamente identico e consiste nel mettere tra parentesi la variabile o la stringa che volete scrivere sulla pagina. I più pigri saranno contenti di sapere che in realtà le parentesi non servono e possono essere omesse. Basterà ad esempio scrivere echo seguito da una stringa qualsiasi e poi terminare l'istruzione con il punto e virgola per vederla magicamente apparire nella nostra pagina HTML. Probabilmente non ve ne siete accorti ma ho appena introdotto un' altra grande verità del PHP. Tutte le istruzioni devono essere terminate da un punto e virgola ;. La pena per chi non rispetta questo dogma sarà una miriade di errori.

Per i più smanettoni volevo inoltre fare notare come la funzione echo sia in generale più veloce della print e quindi è consigliabile usarla per tutti gli output. Questo perché la echo permette, a differenza della print, di stampare più stringhe a video semplicemente separandole con una virgola ,. La print invece richiede l'utilizzo del operatore di concatenamento, il punto ., che genera ogni volta una nuova stringa. In ogni caso per quanto la echo sia veloce è sempre buona abitudine ridurre il più possibile gli output. L'ideale, infatti, sarebbe ridurre tutti le scritture in un singolo punto alla fine di ogni pagina quando tutte le elaborazioni sono state completate.

<?php

/* semplice output con echo e print */
echo('Ciriciao !');
print('Ciriciao !');

/* le parentesi possono anche essere omesse */
echo 'Ciriciao !';
print 'Ciriciao !';

/* output di più stringhe con echo e print */
echo 'ciao','!';
print 'ciao'.'!';

?>

Le variabili

Come nella maggior parte dei linguaggi di programmazione anche in PHP le variabili sono un tassello fondamentale. Come certamente saprete una variabile è un oggetto che userete poi per contenere numeri, stringhe o altri oggetti senza sapere a priori il loro valore. Potete pensare ad una variabile come ad una scatola con scritto sopra un nome il cui contenuto può variare dal rossetto all'albero di natale. In PHP per indicarne una si usa il simbolo $ seguito da una stringa che rappresenterà il nome che userete per riferirvi alla variabile. Il nome può essere composto da tutte le lettere dell'alfabeto, da cifre e il carattere underscore _. Notate bene però che la prima lettera di una variabile non può essere un numero. Se si viene da linguaggi come il Visual Basic è da sottolineare anche che state usando un linguaggio case-sensitive che tiene conto sia delle maiuscole che delle minuscole all'interno del nome, quindi $uno e $Uno sono due variabili distinte. A differenza di altri linguaggi, come C e C++, il PHP non richiede al programmatore di dichiarare le variabili che intende usare indicando il tipo e ci permette di usarle direttamente nel codice. Ecco alcuni esempi.

<?php

/* Questi nomi di variabile sono tutti corretti */
$scatola = 'ciao';
$_scatola = 1;
$SCATOLA_1 = "23";
$SCaTOLA_1 = 19;

/* Mentre questo nome non è corretto */
$1_ciao = 11; // un numero è la prima lettera del nome !

?>

Altra caratteristica importante del PHP sono le variabili dinamiche. In alcuni casi potrebbe tornarvi utile usare delle variabili di cui non sapete nemmeno il nome. In questo caso il PHP vi permette di usare il contenuto di una variabile come nome della variabile che volete usare. Immaginate ora che la variabile $a contenga il valore cassetto e che nel vostro programma esista una variabile di nome $cassetto che contiene un valore qualsiasi che per ora non vi interessa. Per poter usare il contenuto della variabile $a in modo da richiamare il valore di $cassetto non dovrete far altro che aggiungere un altro simbolo $ prima di quello già presente. Se provassi a spiegarlo in altri modi riuscirei solo a confondervi le idee perciò sono convinto che un esempio vi farà capire al volo cosa intendo.

<?php

/* inizializza le variabili */
$a = 3;
$b = 6;
$c = 9;
$tot = 0;

$v = 'a';
$tot =  $tot + $$v; // ora $tot contiene 3

$v = 'b';
$tot =  $tot + $$v; // ora $tot contiene 9

$v = 'c';
$tot =  $tot + $$v; // ora $tot contiene 18

?>

I valori contenuti dalle variabili possono essere di vari tipi. Incominciamo col definire il numero intero che in PHP può variare a seconda del sistema operativo o architettura su cui si trova il server, spesso però si tratta di un numero a 32bit. Possono essere sia con che senza segno. Essendo un numero di 32 bit è facile trovare i valori massimi che è possibile rappresentare anche con una calcolatrice ma per ricordarci meglio diciamo che il range va da -2 miliardi a +2 miliardi.

<?php

/* alcuni esempi di numeri interi */
$intero1 = 0;
$intero2 = 12;
$intero3 = -1;
$intero4 = 10 * 10;

?>

Esistono poi i numeri in virgola mobile conosciuti anche come numeri reali. In altri linguaggi vengono chiamati double, float e cosi via. In PHP i decimali vengono preceduti dal punto e non dalla virgola come noi italiani siamo abituati a fare. Oltre a poter rappresentare decimali questo tipo di valore supporta anche i numeri in notazione scientifica.

<?php

/* alcuni esempi di numeri in virgola mobile */
$float1 = 3.141592;
$float2 = -2.71828;
$flaot3 = 8.27e10;
$float4 = 1.67e-27;

?>

Il tipo booleano è forse il più semplice di tutti. Può assumere solo due valori, vero o falso. Può essere usato per immagazzinare il risultato di alcuni confronti fra variabili.

<?php

/* esempi di valori booleani */
$bool1 = TRUE;
$bool2 = FALSE;

?>

In alcuni rari casi vi potrebbe essere utile eliminare completamente una variabile dalle tabelle interne del PHP quindi unset vi tornerà estremamente utile. Questa particolare funzione accetta semplicemente la variabile che vogliamo cancellare come ingresso annientandola completamente.

Le stringhe

In PHP le stringhe vengono racchiuse dal simbolo di apice singolo ' oppure dal simbolo da doppi apici ". Esistono però alcune differenze nell'uso delle due soluzioni. Una stringa racchiusa con apici singoli e in genere più veloce e ne consiglio l'uso perché il PHP non è costretto a fare particolari elaborazioni. Mentre all'interno di una stringa racchiusa tra doppi apici vengono ricercati tutta una serie di caratteri di escape, inoltre se il nome di una variabile viene riconosciuto al suo interno questo verrà sostituito con il suo contenuto. In PHP il carattere che apre una determinata sequenza di escape è il \ conosciuto anche come backslash. È possibile indicare una stringa anche tramite la sintassi heredoc. Questa particolare sintassi risulterà familiare a chi ha usato per un po' una shell Unix o Linux. Non si deve far altro che racchiudere tutto il testo tra due speciali sequenze di caratteri. Anche in questo caso un esempio vale più di mille parole.

<?php

$variabile = 'Ciao';

$str1 = '$variabile!\n Come stai ?'; // $str1 contiene: $variabile!\n Come stai ? 

$str2 = "$variabile!\n Come stai ?"; // $str2 contiene: Ciao!
                                     // Come stai ? 

/* stesso esempio però con la sintassi Heredoc 
   In questo caso la variabile $str3 conterrà:
   Ciao!
   Come stai?
*/
$str3 = <<<EOF
$variabile! 
Come stai ?
EOF;

?>

Nell'esempio qui sopra potete notare nella sintassi heredoc alcuni punti molto singolari. Innanzitutto i tre segni di minore <<< indicano al PHP che quello che state incominciando è una stringa Heredoc, dopo di che potete notare la stringa EOF che ritorna poi anche infondo all'esempio. Questa è usata per terminare la stringa. Per comodità e abitudine io uso sempre EOF ma questo non vi vieta di usare qualsiasi altra stringa.

I più accorti avranno notato anche che nelle prime due variabili è stato usato il carattere di escape \ seguito da una lettera. Avranno notato inoltre che in uno dei due esempi questa particolare sequenza di escape scompariva e modificava l'aspetto della stringa. Ora alcuni di voi si staranno chiedendo perché nell'esempio con apici singoli la sequenza non abbia funzionato. La risposta è molto semplice e dovreste già conoscerla visto che, come ho già detto, quando una stringa è racchiusa tra apici singoli il PHP non sostituisce i nomi delle variabili e non cerca nessuna sequenza di escape. L'unica eccezione è la seguente sequenza \' che viene usata quando si vuole inserire un apice all'interno di una stringa.

In sostanza il carattere di escape si usa quando volete inserire in una stringa il carattere speciale che la delimita. Esistono poi altri caratteri speciali che hanno una loro rappresentazione tramite una sequenza di escape come l'acapo, la tabulazione, il simbolo del dollaro e per finire il carattere di escape stesso.

<?php

/* alcuni esempi di stringhe con sequenze di escape */
$escape = 'in questa stringa voglio inserire il simbolo "\'" !!';
$altro  = "come prima. ora però voglio il simbolo '\"' !! ";

/* altre sequenze di escape */
$escape1 = "e se voglio inserire il carattere di escape ?? \"\\\"";
$sequenza = "vai a capo \nOra!";
$escape2 = "\t tab, \n acapo, voglio tanti \$!!!";

?>

Gli array

Il PHP è forse il linguaggio che ha la gestione più intuitiva degli array. Potete immaginare un array come un vettore di variabili al quale è possibile accedere tramite un indice. È proprio quando si incomincia a parlare degli indici si capisce la potenza di questo linguaggio. Il PHP è infatti in grado di gestire array che possono avere indici sia numerici che associativi e farli condividere nello stesso istante. Potete infatti accedere ai vari elementi di un array tramite un indice numerico che identifica ogni elemento. Il primo sarà alla cella 0 mentre l'ultimo sarà alla cella N-1, dove N è il numero di elementi che sono presenti nell'array. Ma il PHP vi permette di associare ad ogni elemento dell'array anche una chiave composta da una stringa che poi potrete usare a vostra discrezione per accedere al elemento.

<?php

/* crea un nuovo array */
$frase = array('hello', 'world', 'esclamazione' => '!!');

/* ecco come accedere ai vari elementi dell'array */
echo "{$frase[0]} ", $frase[1], $frase['esclamazione']; // stampa la stringa hello world!!

?>

Forse non ve ne siete accorti ma in questo esempio di sole due righe ci sono moltissime novità. Innanzitutto è stato introdotto il metodo standard per creare un array in PHP. Non dovrete far altro che chiamare la funzione array alla quale passerete tutti i vari elementi nell'ordine con cui devono essere inseriti all'interno dell'array. Nel nostro esempio sono tutte stringhe ma avreste potuto usare anche variabili, array e perfino altre chiamate alla funzione array(). Sempre nella stessa riga è possibile vedere per la prima volta come creare una chiave associativa. Nell'ultimo elemento è usato l'operatore => per associare all'elemento !! la chiave esclamazione.

Nella seconda riga non fate altre che accedere all'array appena creato e fare un' output. Come potete vedere per accedere ad un elemento in particolare non dovete far altro che scrivere il nome dell'array che lo contiene seguito dall'indice racchiuso tra delle parentesi quadre. Durante l'output sono stati usati per i primi due accessi l'indice numerico mentre nell'ultimo la chiave associativa che era stata impostata durante la creazione dell'array. Come ultima cosa volevo far notare le parentesi graffe nella prima stringa tra doppi apici. Queste non sono state messe per puro divertimento ma servono per aggirare una piccola debolezza dell'interprete del PHP che altrimenti non riuscirebbe a capire che state usando una variabile e che deve perciò sostituirla con il suo contenuto.

A differenza di altri linguaggi che richiedo di riallocare la memoria o di conoscere altri dettagli tecnici il PHP vi permette di aggiungere e rimuovere elementi con una semplicità unica. Quindi come fare per aggiungere un elemento in fondo all'array del esempio qui sopra? La risposta è semplice, vi basterà scrivere il nome dell'array seguito dalle canoniche parentesi quadrate senza specificare alcun indice ed eguagliare il tutto al valore o variabile che volete che la nuova cella assuma. Inoltre nessuno vi impedisce di usare indici numerici o associativi a vostro piacimento. Non serve che gli indici siano consecutivi, infatti è possibile avere dei buchi tra un indice e il successivo. Sono anche disponibili funzioni come array_push() che vi permettono di accodare più elementi con la stessa istruzione al vostro array. Ora che avete aggiunto degli elementi come fare per togliere quelli che non vi interessano? Anche qui la funzione unset viene in vostro soccorso, permettendovi di cancellare singoli elementi oppure interi array in un solo colpo.

<?php

/* crea due array vuoti */
$ar = array();
$ra = (array)null;
$variabile = 'ciao';

/* aggiunge aggiunge elementi al primo array con la funzione array_push() */
array_push($ar, 'uno', 10, $variabile);

/* aggiunge gli stessi elementi con un' altra tecnica al secondo array */
$ra[] = 'uno';
$ra[] = 10;
$ra[10] = $variabile; // crea un buco. gli elementi con indice da 2 a 9 non esistono


/* cancella un elemento dal secondo array */
unset($ra[10]);

/* cancella un' intero array */
unset($ar);

?>

Come già detto ogni cella di un' array essendo una variabile vera e propria può contenere anche altri array. Questo ci porta a parlare degli array multidimensionali. Usare questi tipi di array non differisce in alcun modo dagli array normali, non si deve far altro che usare di nuovo le parentesi quadrate ogni volta che accediamo ad un' elemento. Ecco alcuni esempi.

<?php

/* semplice array bidimensionale */
$bmp = array( array(255, 12, 35),
              array(23,  56,  0),
              array(65,  65, 65) );

echo $bmp[1][2]; // stampa "0"

/* semplice array tridimensionale */
$tred = array(
          array(
            array(12, 11, 13, 14), array(12, 9))
          ,
          array(
            array(12, 11, 13, 14), array(12, 9))
          ,
          array(
            array(12, 11, 13, 14), array(1000, 9))
          );
         
echo $tred[2][1][0]; // stampa "1000"

?>

Volevo ricordare infine che il PHP fornisce ai programmatori moltissime altre funzioni per lavorare con gli array. Per l'elenco completo fate riferimento all'immancabile guida di riferimento in italiano.