Guida di PHP (base), Variabili

Nel capitolo precedente abbiamo visto come stampare la data corrente in una pagina web. Vediamo ora un esempio molto simile, in cui però viene usata una variabile.

<html>
<head>
<title>Data e ora</title>

<body>
<?php
	date_default_timezone_set('Europe/Rome');

	$dataDiOggi = date("d-m-Y");

	echo "Ciao, oggi è il ";
	echo $dataDiOggi;
?>
</body>
</html>

Come vediamo, al posto di echo date("d-m-Y"); (che avevamo usato nel capitolo precedente), alla riga 12 troviamo echo $dataDiOggi;, ed è stata aggiunta la riga 9, contenente $dataDiOggi = date("d-m-Y");. Intuitivamente, $dataDiOggi è una variabile, e la sua funzione è quella di 'ospitare' il valore della funzione date() (riga 9), per poterlo riutilizzare più avanti (riga 12).

Cosa sono

Prima di inoltrarci nei dettagli spieghiamo cosa è una variabile. Possiamo definirla come un riferimento in memoria a un dato in particolare (un numero, una stringa, ecc. ecc.). Un modo Un “pezzo” di memoria RAM riservato con un certo nome, per archiviare un'informazione e riutilizzarla a seconda delle proprie necessità.

Le variabili possiedono tre proprietà principali: tipo, valore e indirizzo.

  • Il tipo specifica il dato da rappresentare definendo un range di valori possibili che può assumere una variabile. Ad esempio il tipo int rappresenta un numero intero, mentre un char un carattere dell'alfabeto, come vedremo più avanti.

    A questo punto può sorgere una domanda spontanea. Ma se in memoria sono presenti solo 0,1, e quindi alla fine una variabile è solo una sequenza di 0 e 1, come fa il compilatore a distinguere i diversi tipi? In base alla dimensione della variabile. Quando definiamo un int, viene associata alla variabile una dimensione specifica, che sarà diversa da quella che contiene un carattere. In genere, poi, l'interprete del linguaggio di programmazione ricorda il tipo di ogni variabile e controlla il lavoro del programmatore (ad esempio, assicurandosi che non cerchi di memorizzare caratteri alfabetici dentro variabili int e cose del genere). Nel prossimo capitolo vedremo come PHP controlla i tipi di variabile, e scopriremo che si tratta di un linguaggio estremamente permissivo.

  • Il valore è il contenuto presente nella cella di memoria in cui è stato salvato il dato. Quando facciamo un assegnamento a una variabile, ad esempio $primo = 5, riempiamo la porzione di memoria dedicata alla variabile $primo con il valore binario 101, che rappresenta il 5 in decimale. Da osservare che a seconda dell'architettura della macchina su cui eseguiamo il programma, la dimensione di una cella di memoria per un numero intero può essere 32 o 64 bit (32 o 64 “caselline” che possono valere 0 o 1). Nel nostro esempio supponendo di avere celle da 32 bit, prima di 101 ci saranno 29 zeri.
  • Ogni variabile ha un indirizzo associato, in modo da poter risalire alle informazioni descritte nei precedenti punti. Qui il discorso si complica e rischiamo di entrare in dettagli tecnici che si distaccano dal contesto di questo articolo, anche perché, al contrario di come avviene in altri linguaggi, in PHP la gestione degli indirizzi di memoria è completamente a carico dell'interprete, e quindi non ci avremo mai a che fare quando programmiamo. Limitiamoci a sapere che per ogni variabile durante l'esecuzione del programma viene riservato un indirizzo in memoria.

Differenze rispetto ad altri linguaggi

Premetto che cercare differenze tra linguaggi diversi sviluppati per gli usi più disparati è un compito arduo e spesso risulta inconcludente. Tuttavia il nostro intento è quello di focalizzarci su una differenza importante, soprattutto per coloro che sono arrivati al PHP dopo aver studiato linguaggi come C o altri fortemente tipizzati. Il PHP rispetto al C o al Java consente più libertà al programmatore, perchè non richiede di specificare il tipo delle variabili. Supponiamo di voler dichiarare un numero intero, in C o in Java è necessario specificare il tipo int prima del nome della variabile. Al contrario in PHP il tipo della variabile viene omesso. L'interprete si occuperà di trattare il tipo della variabile a seconda del suo contenuto. Per questo motivo PHP viene detto un linguaggio a tipizzazione debole.

E se una variabile viene letta prima che le sia assegnato un valore? In questo caso PHP, a seconda del contesto, associa un valore di default. Ad esempio nel caso in cui una variabile non assegnata venga coinvolta in un'operazione aritmetica (es. 2 + $a) il suo valore sarà 0, mentre nel caso di un confronto tra stringhe assumerà il valore della stringa vuota "".

Tuttavia nonostante questa libertà, è sconsigliato dichiarare variabili senza assegnare un valore, poiché si crea confusione, rischiando di scrivere codice corretto sintatticamente (cioè che viene eseguito senza errori), ma non semanticamente (cioè che non ha il significato che vorremmo dargli, e produce quindi risultati sbagliati). E' un errore semantico non verificare il contenuto prima dell'assegnamento per ovvie ragioni di sicurezza.

Suggerimento: PHP di default non segnala gli errori meno gravi (qui la lista di tutti i tipi di errore). Nel file php.ini (il file di configurazione di PHP, che in un sistema GNU/Linux generalmente si trova in /etc/php.ini, o /etc/php/php.ini) è possibile modificare alcuni parametri in modo da ricevere warning in caso di una variabile priva di valore aggiungendo semplicemente la dichiarazione error_reporting(E_ALL). In alternativa è possibile utilizzare tale dichiarazione all'inizio di qualsiasi script: ricordandoci di inserirla tra <? e ?>, ad esempio:

<?
$a = $b + 1;            // A $b non è mai stato assegnato un valore (PHP userà 0 come valore di default)
                        // Questo è considerato un errore non critico (Notice), e non viene segnalato.
error_reporting(E_ALL); // Attiva la segnalazione di tutti i livelli di errore
$a = $c + 1;            // Stesso errore, ma ora PHP mostra un messaggio Notice sulla pagina
?>

La tipizzazione debole ha il vantaggio di rendere il codice più snello, più semplice da scrivere ma può nascondere errori semantici difficili da riscontrare soprattutto se siamo novizi del linguaggio. Più avanti nella guida impareremo ad affrontare i casi limite e capire come evitare le trappole semantiche sfruttando funzioni di libreria.

Dichiarazione e assegnazione di variabili

Come abbiamo visto nell'esempio iniziale, una variabile in PHP è sempre introdotta dal carattere jolly $, a cui segue il nome che la identifica. Il nome di una variabile è ovviamente scelto dal programmatore; è importante scegliere per ogni variabile un nome che ne rappresenti il contenuto in un colpo d'occhio, in modo da mantenere il codice leggibile. Ad esempio, se devo creare una variabile per contenere la data di oggi, sarà meglio chiamare questa variabile $dataOggi, piuttosto che $pippo o $x.

Per dichiarare una variabile (ovvero crearne una nuova) in PHP è sufficiente usarla: $primaVariabile;. PHP crea una nuova variabile quando ne incontra una con un nome mai usato prima.

Per assegnare un valore a una variabile è necessario utilizzare l'operatore di assegnamento = (da non confondere con l'operatore di uguaglianza ==):

$primaVariabile = "prima variabile"; //ricordiamoci il ; alla fine dell'assegnamento

PHP inoltre consente di poter riassegnare valori di tipi diversi a una variabile precedentemente assegnata:

$primaVariabile = "prima variabile"; //Rappresenta una stringa
$primaVariabile = 1;                 //Rappresenta un intero

La ragione di questa possibilità è la stessa che abbiamo spiegato nel paragrafo precedente. PHP è indulgente sui tipi, quindi è possibile ridefinire un valore di una variabile che precedentemente rappresentava un tipo diverso.

Le funzioni empty() e isset()

Nei precedenti paragrafi abbiamo accennato alla possibilità di poter dichiarare una variabile senza assegnarli un valore. Per evitare di cadere in trappole semantiche la libreria standard del PHP mette a disposizione una funzione che permette di verificare se una variabile è stata precedentemente definita.

isset()

Dal manuale di PHP:

Descrizione della funzione isset() nel manuale di PHP.

Quindi isset() restituisce TRUE se la variabile esiste e quindi si riferisce a un valore, mentre restituisce FALSE in caso contrario. Vediamo un semplice esempio:

<?
$base = 2;
$altezza = 5;
$area = $base * $altezza;
echo isset($base);      // TRUE
echo isset($altezza);   // TRUE
echo isset($area);      // TRUE
echo isset($perimetro); // FALSE: la variabile $perimetro non è stata mai definita
?>

Chi già mastica un po' di programmazione, intuirà l'utilità di questa funzione in un costrutto if:

<?php
if(isset($n))
	echo "Variabile definita";
else
	echo "Variabile non definita";
?>

Per chi non ha idea di cosa significhi il codice qui sopra, niente paura: il mistero sarà svelato tra pochi capitoli.

empty()

La funzione empty() invece controlla il contenuto della variabile. Restituisce true se la variabile è vuota, false in caso contrario:

Descrizione della funzione empty() nel manuale di PHP.

Questa funzione restituisce TRUE se la variabile che gli viene passata come argomento non esiste, ma anche quando esiste e contiene un valore vuoto, come ad esempio:

  • "" (stringa vuota)
  • 0 (0 come intero)
  • "0" (0 come stringa)
  • NULL
  • FALSE

Nel prossimo capitolo esamineremo nel dettaglio uno dei tipi più usati in PHP, il tipo stringa.

In breve...

In questo capitolo abbiamo visto che...

  • Una variabile è uno spazio di memoria in cui possono essere memorizzati dei dati da usare in futuro.
  • Ogni variabile ha un nome scelto dal programmatore, e tre caratteristiche
    • tipo - il tipo di dato contenuto nella variabile; ad esempio un numero, una stringa di testo, o un valore booleano (vero o falso).
    • valore - il dato vero e proprio contenuto nella variabile.
    • indirizzo - un codice che dice in quale parte della memoria si trova la variabile. In PHP non ci dobbiamo preoccupare degli indirizzi: sono gestiti automaticamente.
  • PHP è un linguaggio a tipizzazione debole, cioè non pone vincoli sul tipo di una variabile. Questo significa che il programmatore non deve dichiarare un tipo per ogni variabile: PHP lo assegnerà (e cambierà, se necessario) automaticamente, a seconda del dato salvato nella variabile.
  • Una variabile in PHP è sempre introdotta dal dollaro ($), seguito dal nome della variabile.
    • Ogni variabile che viene nominata per la prima volta verrà automaticamente creata da PHP.
  • A una variabile può essere assegnato un valore con l'operatore = (es. $pi = 3.14;)
  • Le funzioni empty() e isset() servono a controllare se una variabile esiste e se contiene qualcosa.