In PHP la definizione di un tipo di dato è "implicita", ciò vuol dire che l'interprete di questo linguaggio stabilisce in esecuzione (a runtime) il tipo di dato in funzione del contesto in cui esso esiste e viene utilizzato; naturalmente è possibile forzare un tipo di dato tramite funzioni messe a disposizione da PHP che ricordano quelle utilizzate in un altro linguaggio come C.
La procedura di tipizzazione di un dato è detta type casting. Consiste nell'assegnare forzatamente ad un valore di variabile un determinato tipo di dato, in questo modo esso sarà disponibile per l'esecuzione di determinate operazioni che richiedono specifiche tipologie di valori.
Un esempio classico di type casting è quello che prevede l'inserimento di un valore stringa all'interno di un campo di database che richiede un valore numerico; si immagini di estrarre una cifra da una frase, la sottostringa potrà essere convertita e inserita all'interno dal campo numerico dopo una apposita procedura di conversione.
Il type casting è spesso utilizzato per forzare un tipo di dato in modo da aumentare il livello di sicurezza di un'applicazione, oppure per stabilire in modo definitivo i tipi di dato che dovranno essere gestiti in determinate operazioni.
Uno script potrebbe per esempio richiedere l'utilizzo di valori numerici interi (integer
), quindi un'applicazione potrebbe dover convertire qualsiasi tipo di dato in intero o semplicemente non produrre alcun comportamento fino a quando i valori disponibili non saranno convertiti in interi.
Caratteristiche dei tipi di dato in PHP
Soprattutto per gli utenti alle prime armi, può essere utile un breve elenco riassuntivo dei tipi di dato gestibili tramite il linguaggio PHP:
integer
: numeri interi senza virgola non delimitati da apici, possono essere anche negativi e in alcuni casi vengono utilizzati anche in notazione ottale o esadecimale;string
: sequenze di caratteri (ad esempio una semplice serie alfanumerica delimitata da apici singoli o doppi);binary
: dati numerici espressi in base 2;unicode
: valori codificati, ad ogni carattere viene assegnato un codice univoco identificativo indipendente dalla piattaforma di riferimento;array
(ovettori
): variabili contenenti più valori, le variabili interne ad un array sono di uno stesso tipo denominatotipo base
dell'array, si avranno quindi array di interi, di stringhe, di caratteri etc.boolean
obool
: valori veri o falsi (come per esempio lo0
, un valore NULL o un array privo di valori etc.);object
: insieme di dati associati a specifiche proprietà contenenti i metodi per manipolare i dati stessi;double
ofloat
oreal
(a seconda del livello di precisione): numeri in virgola mobile, non delimitati da apici, con uno o più numeri decimali dopo la virgola;
Sinteticamente è possibile dire che PHP mette a disposizione dei tipi di dato detti primitivi (o "scalari") come per esempio i valori booleani, gli interi, i numeri in virgola mobile (o "reali") e le stringhe, vengono forniti inoltre anche due tipi di dato detti "composti" che sono gli array e gli oggetti.
Come anticipato in precedenza, PHP non richiede (o non supporta ) una definizione esplicita del tipo di dato associato ad una determinata variabile, ne consegue che il tipo di dato viene determinato dal contesto in cui la variabile viene utilizzata, quindi se a una variabile dovesse essere associato un valore intero questa diventerà una variabile intera, diversamente, tramite l'associazione di un valore stringa, questa diventerà una variabile stringa.
Un esempio classico di questa definizione contestuale del tipo di dato è quello relativo all'utilizzo dell'operatore di addizione ("+"); la sommatoria di due operandi in virgola mobile genereranno un valore real, stesso discorso per quanto riguarda due interi. Da notare che PHP non influisce sul tipo di dato dei due valori utilizzati come operando ma sul risultato finale dell'operazione matematica svolta. I seguenti esempi riassumono efficacemente quanto appena descritto:
<?php // $var è una stringa (codice ASCII 50) $var = "2"; // $var, sommata ad un intero, diventa un intero $var += 3; // $var diventa un numero a virgola mobile $var = $var + 1.6; // tipo di dato intero, 18 $var = 11 + "7 nani"; // tipo di dato intero, 14 $var = 11 + "3 Re Magi"; ?>
Se si cercasse di convertire una stringa non espressa sotto forma di numero puro, il cast terrebbe conto della presenza di spazi e dei caratteri non validi presenti dopo il numero puro, per cui:
- "30" verrebbe convertito in 30, da stringa in numero puro a intero;
- "30.5" verrebbe convertito in 30, da stringa alfanumerica con punto e decimale a intero;
- "30,5" verrebbe convertito in 30, da stringa alfanumerica con virgola e decimale a intero;
- "30 " verrebbe convertito in 30 eliminando lo spazio dopo il numero;
- " 30 " verrebbe convertito in 30 eliminando entrambi gli spazi;
- "30valore" verrebbe convertito in 30 eliminando i caratteri non validi dopo il numero puro;
- "valore30" verrebbe convertito in 0.
Si veda ora un esempio relativo alla conversione di un intero in valore booleano:
<?php // variabile con valore intero $valore_intero = 8; // stampa delle informazioni var_dump($valore_intero); echo '<br />'; // conversione in valore booleano $valore_booleano = (bool)$valore_intero; // nuove informazioni var_dump($valore_booleano); ?>
L'output dello script sarà il seguente:
int(1) bool(true)
Il cast "bool" permette la conversione di un tipo di dato in un booleano, in questo caso il risultato "bool(true)" è dovuto al fatto che "1" è un vero valore "booleano", lo stesso risultato si sarebbe ottenuto nel caso si cui si l'operazione avesse coinvolto un numero negativo, una stringa etc.
Lo "0" anche espresso sotto forma di numero puro in una stringa, non è un valore booleano valido, così come non sono validi "array()" (un vettore vuoto, cioè privo di valori), una variabile a cui viene associato come valore "" (una stringa vuota), FALSE e NULL.
Si analizzi ora il prossimo esempio di type casting dedicato alla conversione di un array in un oggetto:
<?php //definizione di un array $vettore = array('colore'=>'giallo', 'mese'=>'luglio', 'stagione'=>'estate'); // conversione dell'array in oggetto $oggetto = (object)$vettore; // stampa di uno degli elementi dell'oggetto echo $oggetto->mese; ?>
In questo caso, grazie al cast "object" è stato possibile effettuare la conversione di un array in un oggetto, è particolarmente interessante il fatto che l'oggetto conservi le chiavi è i valori presenti all'interno del vettore, l'output dello script sarà infatti "luglio" esattamente come nel caso in cui si avesse proceduto con la stampa del valore corrispondente alla chiave "mese" dell'array.
Naturalmente, gli array non sono gli unici tipi di dato che possono essere convertiti in oggetti, a questo proposito si veda l'esempio successivo che propone questa volta la conversione di una semplice stringa utilizzando il modificatore "bool":
<?php // variabile con valore stringa $stringa = 'esempio di typecasting in PHP'; // conversione del tipo di dato in oggetto $oggetto = (object)$stringa; // stampa del valore echo $oggetto->scalar; ?>
In questo caso la stampa del valore relativo ("scalar") dell'oggetto generato restituirà in output la stringa inizialmente attribuita come valore alla variabile "$stringa", questo accade perché in seguito al processo di conversione il linguaggio stesso assegna il valore all'elemento "scalar".
Conclusioni
Il type casting, cioè l'assegnazione forzata di un tipo di dato ad una determinata variabile, è una procedura molto importante per determinare il comportamento di un'applicazione soprattutto in un linguaggio come PHP che assegna alle variabili un tipo di dato determinato dal contesto.
In questa breve trattazione sono stati descritti i tipi di dati gestiti da PHP e i costrutti necessari per effettuare operazioni di type casting sulle variabili.