Tipi di dato e operatori

Indice

In questo capitolo verranno introdotti gli elementi fondamentali su cui si basano gran parte dei linguaggi di programmazione tra cui anche PHP. Sintatticamente, PHP ricorda linguaggi c-like come C/C++ o Java. Infatti come questi, PHP è case-sensitive per cui occorre prestare molta attenzione alle convenzioni utilizzate per la nomenclatura dei vari elementi. Imparerai ad usare adeguatamente i commenti, capirai quali tipi di dati gestisce PHP, cosa sono le variabili e cosa sono le costanti, apprenderai come utilizzare gli operatori per generare espressioni complesse e a gestire gli array.

I commenti
All’interno del codice sono molto importanti i commenti.
Queste parti di codice non hanno nessun valore funzionale per il motore PHP, poiché vengono da esso ignorate, ma hanno grande importanza per il programmatore o per chi comunque leggerà il codice.
L’uso dei commenti infatti aumenta di molto la leggibilità del codice stesso, senza appesantire l’esecuzione degli script: si tratta quindi di strumenti utili per aumentare la produttività e scrivere correttamente il codice.

Esistono varie possibilità per inserire i commenti all’interno del codice.
Si possono usare dei commenti in stile C/C++, anteponendo al testo due barre //:

Copia codice

// Questo è un commento in stile C++
Oppure si può utilizzare un modo conforme allo stile di un altro linguaggio, il Perl, che consiste nell’anteporre al testo il carattere cancelletto # :
Copia codice

# Questo è un commento, però in stile Perl
Questi modi permettono di commentare una riga di codice per volta: l’interprete PHP quando incontra uno dei due caratteri speciali // o # salterà l’intera riga.

Se si vogliono inserire commenti lunghi più di una riga, si può ogni volta inserire uno dei due caratteri speciali // o # all’inizio di ogni riga, oppure utilizzare un’altra notazione anch’essa derivante dal C/C++:

Copia codice

/* Questo è un commento che
può occupare più di una riga */
In questo caso, i commenti all’interno del codice hanno un coppia di caratteri speciali di apertura /* e una coppia di chiusura */.
Tipi di dato
PHP gestisce cinque differenti tipi di dati primitivi:

Numeri interi
I numeri interi corrispondono all’insieme degli interi.
Sono rappresentabili e gestibili numeri interi compresi tra -2.147.483.658 e +2.147.488.657 su un sistema a 32 bit.
I numeri interi possono essere espressi indifferentemente nella modalità decimale, ottale ed esadecimale.
Numeri in virgola mobile
I numeri in virgola mobile sono dei numeri dotati di una parte intera e di una parte decimale posta dopo la virgola.
La notazione di questi numeri può essere quella classica, composta da un numero con la parte decimale dopo la virgola (come 1,4 o 1234,7, ecc.), oppure quella esponenziale nella forma: 0.17E16. In questo caso ogni numero è composto da una coppia di valori: la mantissa e l’esponente. La mantissa è un valore frazionario, mentre l’esponente è un numero intero. Il valore del numero così espresso si ottiene moltiplicando la mantissa per la potenza di 10 con grado pari all’esponente. Per esempio 0.17E16=1.7×10^15
Tipo stringa
Il tipo stringa ci permette di gestire singoli caratteri alfanumerici oppure sequenze di caratteri (stringhe).
I valori di questo tipo vengono rappresentati racchiudendo i caratteri fra appositi delimitatori che possono essere singoli apici o doppi apici.
La stringa rappresentata verrà trattata diversamente dal motore PHP a seconda del delimitatore scelto.
In particolare, le stringhe racchiuse fra doppi apici vengono rappresentate sostituendo al suo interno i nomi delle eventuali variabili contenute con i rispettivi valori.

Le stringhe racchiuse fra singoli apici non vengono trattate in alcun modo, e quindi vengono stampate a video così come sono.
Esempio di stringhe a confronto in una pagina PHP

Copia codice

<!DOCTYPE html>
<html lang="it">
<title>Ciao Mondo in PHP
<title>
<head>
<meta charset="utf-8">
</head>
<body>
<p>
<?php
$a = 10;
$b = 5;
$c = 'una stringa';
$d = '5 stringhe';
$e = '10';
$f = 'pippo';
print ('$a : ' . $a . '<br />');
print ('$b : ' . $b . '<br />');
print ('$c : ' . $c . '<br />');
print ('$d : ' . $d . '<br />');
print ('$e : ' . $e . '<br />');
print ('$f : ' . $f . '<br />');
print ('1) $a == $b : ' . ($a == $b) . '<br />');
print ('2) $b == $d : ' . ($b == $d) . '<br />');
print ('3) $c > $f : ' . ($c > $f) . '<br />');
print ('4) $a === $e : ' . ($a === $e) . '<br />');
?>
</p>
</body>
</html>
Lo script visualizzato nell’esempio dà come output:
Copia codice

$a : 10
$b : 5
$c : una stringa
$d : 5 stringhe
$e : 10
$f : pippo
1) $a == $b :
2) $b == $d : 1
3) $c > $f : 1
4) $a === $e :
In alcuni casi può far comodo utilizzare un’istruzione mista composta da due o più stringhe concatenate, ognuna delle quali può essere delimitata da apici o doppi apici.
Se ad esempio volessimo stampare la stringa:
Copia codice

Il valore della variabile $variabilestringa è Pippo
è necessario utilizzare l'istruzione:
Copia codice

print ('il valore della variabile $variabilestringa ' . "è $variabilestringa");
In questo caso solo la seconda variabile verrà sostituita con il suo valore, la prima verrà scritta così com’è; da notare l’uso dell’operatore punto per concatenare due stringhe.

Particolare attenzione va posta quando si usano caratteri speciali all’interno di stringhe, poiché potrebbero creare ambiguità e restituire risultati indesiderati. Quando si usano tali caratteri, è necessario anteporre il carattere backslash per far capire al motore PHP le nostre intenzioni. Ecco una lista di caratteri speciali:

\' = singolo apice, valido solo in stringhe delimitate da singolo apice

\" = doppio apice, valido solo in stringhe delimitate da doppio apice

\\ = backslash

\n = new line

\r = ritorno a capo

\t = tab orizzontale

\x00 - \xFF = caratteri esadecimali

Tipo booleano
I valori di tipo booleano possono contenere solo due valori: TRUE o FALSE.
Sono molto importanti in quanto possono essere utilizzati come condizioni nelle istruzioni condizionali.
Tipo NULL
Il tipo NULL viene usato per indicare l’assenza di valore o l’assenza di un’istanza.
Normalmente si usa per annullare il valore di una variabile o per eliminare un oggetto che non serve più.

Ci sono poi altre tipologie particolari di tipi di dati:

  1. gli array (collezione di elementi);
  2. gli oggetti (elementi appartenenti a determinate classi);
  3. le risorse (i file, le connessioni a database).

Gli ultimi due tipi di dati non verranno qui trattati perché la loro complessità li pone oltre gli obiettivi.

Variabili e costanti
Una variabile è una zona di memoria cui viene associato un nome. La dimensione di quella zona di memoria è conseguenza del tipo (tipo di dato).
Il contenuto delle variabili in un dato istante t costituisce lo stato dell’applicazione in quell’istante.
Eseguire un’istruzione ha come effetto quello di causare la transizione da uno stato ad un altro.
Le costanti, invece, sono semplicemente associazioni tra nomi e valori che permettono ai programmatori di ottimizzare lo sviluppo ma che non incidono in nessun modo sulla performance o sull’esecuzione dell’applicazione.
La costante è un modo per istruire l’interprete che ogni volta che incontra un nome di costante sa di dover usare il valore associato.
Dichiarare una variabile
La sintassi per dichiarare una variabile è la seguente:
Copia codice

$oggetto = "auto";
Al contrario di quanto accade per linguaggi di programmazione tipo C++ o Java, il linguaggio PHP non impone la dichiarazione preventiva di una variabile, né la specifica del tipo di dato che sarà destinata ad assumere.

Esistono alcune regole sintattiche da rispettare per poter dichiarare correttamente una variabile, in particolare:

  • al nome di ogni variabile va anteposto il carattere ”dollaro” $;
  • il nome della variabile può essere composto esclusivamente da lettere, numeri o caratteri di sottolineatura;
  • il primo carattere di ogni nome di variabile deve essere una lettera o un carattere di sottolineatura ”underscore”.

Quindi, le variabili $f, $oggetto, $_pippo sono tutte valide, mentre $345, $\testo sono dichiarate in modo errato.

È importante notare che PHP è un linguaggio case-sensitive Tipo di linguaggio che discrimina i caratteri maiuscoli dai minuscoli. Esempio pratico: in un linguaggio case sensitive la stringa ”alberto” risulterà diversa dalla stringa ”Alberto”, quindi la variabile $oggetto è diversa dalla variabile $Oggetto.

Una volta dichiarata una variabile viene di solito inizializzata con un valore, ad esempio nel caso $oggetto = "auto" alla variabile di nome “oggetto” viene assegnato il valore iniziale “auto”.
Si è detto che una variabile fa riferimento a una particolare zona di memoria del sistema; dal momento che la memoria a disposizione non è mai infinita, è buona norma essere parsimoniosi nell’uso delle variabili per evitare di appesantire troppo il sistema.

Dichiarare una costante
Il PHP dà la possibilità di associare valori fissati come numeri, caratteri, stringhe a dei nomi: è il caso dei valori costanti o semplicemente costanti, il cui valore non può più essere modificato dopo l’assegnamento.
Per dichiarare una costante si utilizza la seguente sintassi:
Copia codice

define ("MINUTES_IN_HOUR" , "60");
Per utilizzarne la costante si procede come segue:
Copia codice

print (MINUTES_IN_HOUR);
Come si intuisce, il primo campo oggetto all’interno delle parentesi tonde (MINUTES_IN_HOUR) è il nome della costante, mentre il secondo oggetto (60) è il valore assegnato a quella costante.
È buona norma scrivere le costanti utilizzando le lettere maiuscole per facilitarne l’individuazione all’interno del codice.
Operatori
Gli operatori sono tra i componenti di base più importanti di qualsiasi linguaggio di programmazione, poiché ci consentono di generare espressioni complesse. Esistono operatori specifici per i vari tipi di dato.
Il PHP ci mette a disposizione diverse categorie di operatori:
[/expandsub1] Operatori aritmetici
Gli operatori aritmetici servono a denotare certe operazioni nel calcolo delle espressioni; solitamente agiscono su un unico argomento (operatori unari) o su due argomenti (operatori binari).

Tabella degli operatori aritmetici
Operatore
Tipo
Descrizione
+
binario
Somma
binario
Sottrazione
*
binario
Moltiplicazione
/
binario
Divisione
%
binario
Modulo o Resto della divisione fra interi
++
unario
Pre/Post incremento
unario
Pre/Post decremento

Il significato degli operatori aritmetici è molto intuitivo eccezion fatta per i due operatori unari di incremento/decremento che servono ad incrementare o decrementare l’operando di uno. Possono essere usati in due differenti modi, ponendoli in testa all’operando oppure in coda ad esso; ognuna delle due soluzioni comporta un’operazione diversa sull’oggetto in questione.
Per esempio:

Copia codice

$pippo = 10;
print ("$pippo " . ($pippo++) . "$pippo");
produrrà la stampa: “10 10 11”.

Lo script stampa prima la variabile $pippo, poi, quando incontra di nuovo la variabile che contiene un operatore di post-incremento, prima utilizza la variabile, quindi ristampa il suo valore e poi lo incrementa di uno.

Allo stesso modo, nell'esempio:
Copia codice

$pippo = 10;
print ($pippo " . (++$pippo) . " $pippo");
// verrà stampata la sequenza: "10 11 11".

In questo caso viene prima stampato il valore della variabile $pippo, poi lo script incontra la variabile con un operatore di pre-incremento: quindi, prima viene incrementata e poi stampata. Analogamente succede per gli operatori di pre-decremento e post-decremento.

Operatore di assegnazione
L’operatore di assegnamento è probabilmente il più conosciuto degli operatori e serve ad assegnare alla variabile che sta a destra dell’operatore il valore che sta a sinistra.
Per esempio:
Copia codice

$nome = 'Paolo';
$a = $b;
$costo = 54;
Come si può notare dall’esempio, alla variabile di sinistra possiamo assegnare un valore costante, un’espressione, una stringa, ecc.

Esistono in PHP particolari operatori di assegnamento che permettono di compattare il codice e renderlo più elegante.

Operatori di assegnamento per compattare codici
Operatori di assegnamento
Codici
$a += $b
$a = $a + $b
$a -= $b
$a = $a – $b
$a *= $b
$a = $a * $b
$a /= $b
$a = $a / $b
$a %= $b
$a = $a % $b
$a &= $b
$a = $a = $b
$a |= $b
$a = $a | $b
$a ^= $b
$a = $a ^ $b
$a .= $b
$a = $a . $b
operatori di confronto
Gli operatori di confronto o relazionali sono fondamentali perché ci permettono, effettuando dei confronti fra valori, di prendere delle decisioni, cioè di far svolgere al nostro script determinate operazioni invece di altre. Quando utilizziamo gli operatori di confronto, confrontiamo i due valori posti a sinistra e a destra dell’operatore stesso. Il risultato di questa operazione sarà, ogni volta, vero (true) o falso (false). Questi operatori sono:

  • == : uguale
  • != : diverso
  • === : identico (cioè uguale e dello stesso tipo: ad esempio per due variabili di tipo intero)
  • > : maggiore
  • >= : maggiore o uguale
  • < : minore
  • <= : minore o uguale
Operatori logici
Gli operatori logici possono essere usati per combinare vari valori booleani associandoli agli operatori di confronto, creando così delle vere e proprie espressioni booleane complesse.

Gli operatori logici supportati da PHP sono:

  • && = valuta se entrambi gli operatori sono veri
  • || = valuta se almeno uno degli operatori è vero
  • ! = si usa con un solo operatore, è verificato se l’operatore è falso
  • AND = come && ma con minore precedenza
  • OR = come || ma con minore precedenza
  • XOR = OR esclusivo, funziona per esclusione degli operandi; se uno solo è vero l’altro viene assunto falso senza eseguire nessun controllo su di esso.

Come si può notare dalla lista degli operatori logici, gli operatori AND, OR e NOT possono essere rappresentati con due notazioni diverse, che differiscono per il grado di precedenza nel caso di espressioni complesse.

Operatori speciali
Nella pratica essendo possibile combinare diversi operatori in espressioni piuttosto complicate è opportuno sapere come PHP valuta l’ordine di precedenza dei vari operatori.
Ecco una lista degli operatori organizzata in base alla loro priorità, iniziando da quelli con priorità maggiore:

  • operatori di incremento e decremento (++ --)
  • moltiplicazione, divisione e modulo (* / %)
  • addizione e sottrazione (+ -)
  • operatori di confronto maggiore e minore (> >= < <=)
  • operatori di confronto di eguaglianza e disuguaglianza ( = = = = = != )
  • operatore logico AND nella notazione &&
  • operatore logico OR nella notazione ||
  • operatori di assegnazione comprese le forme contratte
  • operatore logico AND nella notazione AND
  • operatore logico XOR
  • operatore logico OR nella notazione OR

Come per l’algebra, poi, è sempre possibile utilizzare le parentesi per creare precedenze a nostro piacimento.

Dati strutturati: gli array
Gli array (o vettori) sono delle variabili complesse contenenti un insieme eterogeneo di oggetti associati ad indici (o chiavi) di accesso.
Ogni array può contenere numeri, stringhe oppure altri array, in tal caso si parlerà di array multidimensionale.
Dichiarazione degli array
Gli array vengono dichiarati all’interno di uno script PHP seguendo le modalità delle variabili, a eccezione del fatto che un array è dotato di una coppia di parentesi quadre che fanno capire al motore PHP che l’oggetto in questione è, appunto, un array e non una semplice variabile.

Per la dichiarazione degli array si può utilizzare una delle seguenti sintassi:

Copia codice

//dichiarazione di un array vuoto
$variabilearray[];
//dichiarazione di un array contenente un elemento stringa, l'elemento è identificato dalla chiave "0"
$varibilearray[0] = "hello";
//dichiarazione di un array contenente un elemento stringa, l'elemento è identificato dalla chiave "saluto"
$variabilearray["saluto"] = "hello";
Per dichiarare un array può essere usato anche un metodo più immediato, che consiste nell’inizializzare l’array durante la dichiarazione attraverso l’istruzione:
Copia codice

$note = ("do", "re", "mi", "fa", "sol", "la", "si");
Questo metodo di dichiarazione assegna automaticamente a ogni elemento dell’array una chiave numerica a partire dalla chiave zero.

Se vogliamo, invece, che gli elementi dell’array prendano una chiave a partire da un valore numerico da noi scelto possiamo usare questa istruzione:

Copia codice

$note = ( 1 => "do", "re", "mi", "fa", "sol", "la", "si");
nella quale abbiamo dichiarato il primo elemento dell’array assegnandogli la chiave 1 tramite l’operatore =>; agli altri elementi verrà assegnata automaticamente una chiave, con valore numerico incrementato di uno rispetto all’elemento precedente.
Array monodimensionali
Gli array monodimensionali sono il tipo più semplice di array. Si possono pensare come una lista di dati a ognuno dei quali è associata una chiave di accesso.
In genere le chiavi sono di tipo numerico, ma è possibile anche creare array con chiavi alfanumeriche.
L'array:
Copia codice

$note = ("do", "re", "mi", "fa", "sol", "la", "si");
è un array monodimensionale con chiavi di tipo “numerico” poiché, in questo caso, PHP assegna automaticamente una chiave numerica ad ogni elemento dell’array, e quindi si avrà:
Copia codice

do : chiave = 0;
re : chiave = 1;
mi : chiave = 2;
L'array così definito:
Copia codice

$ruolo["attaccante"] = "Del Piero" ;
$ruolo["difensore"] = "Maldini";
$ruolo["portiere"] = "Peruzzi";
è anch’esso un array monodimensionale ma le chiavi associate ai suoi valori stavolta sono di tipo “personalizzato” (o associativo).

Le chiavi di tipo personalizzato o associativo vanno usate insieme agli apici o doppi apici come in questo caso, poiché in caso contrario lo script genererebbe un messaggio di tipo “notice”, continuando comunque a funzionare normalmente.

Bisogna porre particolare attenzione all’uso di array con chiavi personalizzate, poiché questo tipo di chiavi precludono la possibilità di navigare all’interno di un array attraverso gli strumenti automatici basati sugli indici numerici.
In un array dichiarato è ovviamente possibile aggiungere degli elementi o leggerne il contenuto.
La sintassi per l'aggiunta di elementi all'interno di un array è:

Copia codice

$nome_array[] = valore_da_aggiungere;
Con questa istruzione il nuovo valore aggiunto valore_da_aggiungere nell’array $nome_array avrà come chiave il valore numerico successivo alla chiave numerica dell’ultimo elemento.

Dato il seguente array:
Copia codice

$nota = array ("do", "re", "mi", "sol", "la", "si" );
gli elementi dell'array prenderanno le chiavi:
Copia codice

do: chiave = 0;
re: chiave = 1;
mi: chiave = 2;
sol: chiave = 3;
la: chiave = 4;
si: chiave = 5;
Con l'istruzione:
Copia codice

$nota[] = fa;
viene aggiunto l’elemento fa all’interno dell’array $nota; l’elemento aggiunto prenderà la chiave numerica “6”.

Nel caso in cui si voglia assegnare al nuovo elemento aggiunto all’array una chiave di valore personalizzato si dovrà utilizzare la seguente sintassi:

Copia codice

$nome_array[nome_chiave] = valore;
Oltre che aggiungere elementi è anche possibile cancellarli dall’interno di un array seguendo questa sintassi:
Copia codice

unset ($nome_array[valore_chiave]);
Verrà così cancellato dall’array indicato in $nome_array l’elemento identificato dalla chiave riportata fra parentesi quadre.

È importante sottolineare che, cancellando un elemento di un array, viene persa anche la chiave associata a quell’elemento, causando un buco nella lista delle chiavi rimanenti.

Se si vuole cancellare completamente un array con tutti i suoi valori, la sintassi è la seguente:

Copia codice

unset ($nome_array);
Oltre alle operazioni di modifica, un array supporta anche operazioni di lettura.
La sintassi da seguire è la seguente:
Copia codice

$variabile = nome_array[valore_chiave] ;
$variabile = count($nome_array);
La sintassi riportata nella riga uno permette di leggere, all’interno dell’array “nome_array”, il valore dell’elemento identificato dalla chiave “valore_chiave” e di salvarlo nella variabile $variabile.
La sintassi riportata in riga due, invece, ci consente di contare tutti gli elementi dell’array “nome_array” e di salvare questo valore nella variabile $variabile.
Array multidimensionali
Gli array sono collezioni di oggetti che possono contenere, tra le varie tipologie di informazioni, anche altri array. È il caso degli array multidimensionali, i quali consentono di creare strutture multidimensionali complesse come matrici, strutture spaziali o addirittura dotate di un numero superiore di dimensioni.

Un classico esempio di array multidimensionale si ha nel caso in cui si registrano i dati anagrafici di più persone, per ognuna delle quali registriamo nome, cognome, data di nascita e residenza.

Copia codice

$impiegato = array (
array ('nome' => 'Mario',
'cognome' => 'Rossi',
'data_nascita' => '1943/02/11',
'residenza' => 'Milano'),
array ('nome' => 'Luca',
'cognome' => 'Neri',
'data_nascita' => '1955/11/11',
'residenza' => 'Roma')
);
In questo pezzo di codice, abbiamo dichiarato l’array $impiegato, formato a sua volta da due elementi di tipo array.

Ogni elemento è separato da una virgola e ognuno di essi ha un indice numerico a partire da 0.
Gli array che formano gli elementi di $impiegato hanno tutti chiavi personalizzate.