Quando scriviamo un programma, con un qualsiasi linguaggio di programmazione, dobbiamo essere in grado di distinguere i vari tipi di dati che vengono dati in input, processati, assegnati a una variabile o ai parametri di una funzione o restituiti.
Ad esempio, dobbiamo poter distinguere una stringa di testo da un numero intero o decimale.
Oppure dobbiamo poter distinguere un valore booleano true
o false
da altri tipi di dati come numeri interi, decimali o stringhe.
Questa è letteralmente la base della programmazione. Sapere quali sono i tipi di dati e riconoscerli durante l’analisi o la creazione di un programma è fondamentale per capire:
- dove finiscono i dati,
- come vengono elaborati,
- quale sarà il risultato dell’esecuzione di questo programma,
- come manipolare l’output del programma,
- e molto altro…
Riconoscere i tipi di dati è fondamentale anche per sapere quali sono le operazioni che puoi fare con i dati che hai a disposizione.
Indice riassuntivo
Introduzione ai tipi di dati in PHP
PHP come ogni linguaggio di programmazione ha i suoi tipi di dati.
In PHP abbiamo 10 tipologie di dati, 4 scalari, 4 composti e 2 speciali:
Tipi di dati scalari
- String
- Int
- Float
- Bool
Tipi di dati composti
- Array
- Object
- Callable (non lo vedremo)
- Iterable (non lo vedremo)
Tipi di dati speciali
- Null
- Resource
Ecco un’immagine descrittiva della struttura dei tipi di dati:
Definire un tipo di dato
In PHP posso definire un tipo di dato e il suo valore all’interno di una variabile o di una costante.
Facciamo l’esempio dei tipi di dato stringa assegnati a una variabile:
<?php
// Esempi di tipi di dato "string" (stringa) assegnati a una variabile
$stringa1 = "Il mio nome è michele";
$stringa2 = "Sono uno sviluppatore";
$stringa 3 = "Realizzo siti web";
// Diamo l'output a queste variabili
echo $stringa1; // output -> "Il mio nome è michele"
echo "<br>"; // nuova riga HTML
echo $stringa2; // output -> "Sono uno sviluppatore"
echo "<br>"; // nuova riga HTML
echo $stringa3; // output -> "Realizzo siti web"
?>
Facciamo l’esempio con i numeri:
<?php
// Definiamo delle variabili con tipo di dato "Int" o numero
$numero1 = 12;
$numero2 = 25;
$numero3 = 44;
// Diamo l'output di queste variabili
echo $numero1; // output -> 12
echo "<br>"; // nuova riga HTML
echo $numero2; // output -> 25
echo "<br>"; // nuova riga HTML
echo $numero3; // output -> 44
Quindi il concetto è che posso definire i tipi di dato assegnando il valore alla variabile e poi posso ottenere il contenuto in output usando il costrutto echo
oppure print
, print_r()
o var_dump()
;
Posso fare lo stesso con le costanti:
<?php
// Definisco una costante con una stringa e un'altra con un numero
define('STRINGA', 'Il mio nome è Michele');
define('NUMERO', 60);
// Output dei valori delle costanti
echo STRINGA; // output -> 'Il mio nome è Michele'
echo "<br>"; // nuova riga HTML
echo NUMERO; // output -> 60
PHP è un linguaggio a bassa tipizzazione
Un concetto da tenere a mente è che PHP è un linguaggio a bassa tipizzazione. In inglese viene definito come dynamically-typed language o linguaggio a tipizzazione dinamica.
Questo significa che non dobbiamo definire il tipo di dato ma inserire semplicemente un valore, ad esempio, in una variabile o in una costante.
O meglio, il tipo di dato è definito dalla sintassi che utilizzo:
- Con i singoli apici
$var1 = 'testo'
o i doppi apici$var2 = "testo"
so che il tipo di dato è una stringa (string) - Senza singoli o doppi apici avrò un numero (int)
$var3 = 70
Mentre linguaggi come C, C++, C#, Java o TypeScript sono linguaggi ad alta tipizzazione. Quindi significa che ogni volta che assegno un valore a una variabile devo definire il tipo di dato.
Ad esempio nel linguaggio C per poter dichiarare una stringa di testo devo mettere la parola string
all’inizio:
string stringaDiTesto = 'Questa è una stringa di testo';
Mentre se dovevo definire un numero avrei dovuto usare la parola int
:
int numero = 90;
Ma c’è un’eccezione in PHP. Pur essendo un linguaggio a bassa tipizzazione posso definire il tipo di dato usando la pratica del Type Casting
.
Non è obbligatorio farlo, ma è un modo per definire il tipo di dato di un valore che si trova in una variabile.
Per farlo, dopo che ho dichiarato il nome di una variabile, inserisco tra parentesi il tipo di dato prima di inserirne il valore:
<?php
// Il type casting in PHP mi permette di definire il tipo di dato
$string1 = (string) 'Questa è una stringa';
$string2 = (string) "Un'altra stringa!";
$int1 = (int) 74;
$int2 = (int) 55;
La pratica del type casting permette di convertire un tipo di dato in un altro. Ad esempio possiamo convertire una variabile che contiene un numero tra apici:
<?php
// Il type casting serve a convertire un tipo di dato in un altro
$int3 = (int) "55"; // conversione a 55 (senza apici)
$int4 = (int) '44'; // conversione a 44 (senza apici)
Questo valore verrà trattato come un numero dopo il casting, quindi senza apici: non più "55"
ma 55
.
Ora vediamo un po’ più specifico ogni tipo di dato.
Tipi di dati scalari
Una variabile contiene un valore scalare quando si tratta di uno di questi tipi di dati:
- String (stringa)
- Int (numero intero)
- Float (numero decimale)
- Bool (valore booleano)
String
Le stringhe o string sono una sequenza di caratteri che compongono una parola, una frase o un testo.
Puoi definire una stringa dentro una variabile o una costante usando i singoli o i doppi apici:
<?php
$string1 = 'Stringa di testo tra singoli apici';
$string2 = "Stringa di testo tra doppi apici";
// Output valori delle variabili
echo $string1;
echo "<br>"; // nuova riga HTML
echo $string2;
Keyword usata per definire una stringa: string
.
Int
I numeri o int sono numeri interi che possono essere positivi o negativi: -10, -9, -8, -7, …, -1, 0, 1, 2, 3, 4, 5, …, 10.
Vengono assegnati a una variabile senza inserire i singoli o i doppi apici.
Ecco del codice per illustrare come vengono assegnati dei numeri alle variabili:
<?php
// numeri positivi
$int1 = 66;
$int2 = 100000;
$int3 = 67438;
$int4 = 7;
$int5 = 9674;
// numeri negativi
$int6 = -67;
$int7 = -5;
$int8 = -6843;
All’interno delle variabili posso definire un numero minimo e un numero massimo. Questo limite dipende dalla piattaforma sulla quale stiamo lavorando.
La costante PHP_INT_SIZE
definisce il numero massimo per il tipo di dato int che posso definire in una variabile.
Se la costante PHP_INT_SIZE
stabilisce che il numero massimo è 2000000000 (2 miliardi) non potremo definire all’interno di una variabile un numero superiore a questo limite.
Keyword usata per identificare un numero intero: int
.
Float
I numeri decimali o float sono conosciuti anche come doubles o real numbers.
Ecco alcuni esempi per generare un numero decimale o float in PHP:
<?php
$float1 = 15.6;
$float2 = 0.6873;
Possono essere anche numeri decimali negativi:
<?php
$float3 = -5.5;
$float4 = -67.3;
Devi tenere a mente che i float number usano il formato IEEE 754 per migliorare la precisione di questi numeri, ma hanno ugualmente una precisione limitata, come gli altri linguaggi di programmazione.
Quindi alcune operazioni aritmetiche potrebbero dare un grosso margine di errore. La documentazione PHP espone questo nella sezione “warning”.
Keyword usata per identificare un numero decimale: float
.
Bool
Un dato di tipo booleano contiene un valore di verità (truth value) che può essere o vero o falso: true
o false
.
Come l’esempio qui sotto, posso assegnare a una variabile un valore true
o false
:
$ho_fatto_il_login = false;
$sono_maggiorenne = true;
Le parole true
e false
non sono sensibili alla maiuscole e alle minuscole. Per cui se le scrivo nei seguenti modi sono valori sempre validi: TRUE
/ FALSE
, True
/ False
, TrUe
/ FaLsE
eccetera.
I valori booleani vengono usati nelle strutture di controllo if
, if-else
, if-else if
e switch-case
per eseguire o non eseguire parti di codice.
Se dovessimo convertire uno dei seguenti valori in un valore booleano PHP li tratterebbe come valore false
:
- la parole
false
- i numeri interi
0
e-0
- i decimali
0.0
e-0.0
- le stringhe vuote a singoli
''
e doppi apici""
- gli array vuoti
array()
e[]
- i valori
null
Quindi se dovessimo convertire questi valori con il metodo del type casting o se dovessimo inserirli nelle parentesi tonde di un blocco condizionale if
saranno trattati come valori falsi (o falsy values).
Invece, tutti i valori che non sono rappresentati nella lista qui sopra saranno trattati come valori veri (truthy values).
Keyword usata per identificare un valore booleano: bool
.
Tipi di dati composti
Nel linguaggio PHP i tipi di dati composti sono gli array e gli oggetti. Questi elementi permettono allo sviluppatore e al programma di contenere più tipi di dati, e quindi valori, per volta.
Array
Gli array non sono altro che una collezione o una lista di valori ordinati in una coppia chiave-valore.
Ci permettono di memorizzare più valori contemporaneamente in una sola variabile.
Facciamo finta che in PHP vogliamo creare un array che contenga i prodotti aggiunti al carrello.
Partiamo da una variabile e poi utilizziamo il costrutto array()
, poi inseriamo ogni singolo valore separandolo l’uno dall’altro con la virgola:
<?php
$carrello = array( 'computer', 'monitor', 'mouse', 'tastiera', 'webcam');
In questo caso abbiamo creato un array di 5 elementi, tutto questo da una singola variabile! Avremmo potuto allungare la lista inserendo molti più elementi.
Ma come posso accedere a ogni elemento di un array ottenendo il valore di cui ho bisogno?
In PHP, come in molti linguaggi di programmazione, gli array non sono altro che un’accoppiata chiave-valore su base 0.
Questo significa che per poter accedere ai singoli valori di un array devo conoscere la chiave dei valori che ho inserito.
Conoscere la chiave di ogni singolo valore è un ragionamento istantaneo perché sapendo che gli array sono su base 0: la chiave del primo valore sarà 0
, quella del secondo valore sarà 1
, quella del terzo 2
e così via.
Per ottenere un valore da un array utilizzo la sintassi a parentesi quadre partendo dalla variabile che contiene l’array, ad esempio nel nostro caso sarà: $carrello[numero chiave]
.
Proviamo a ottenere il primo elemento dell’array che è la stringa "computer"
, inserisco la chiave del valore tra parentesi quadre:
<?php
echo $carrello[0]; // output -> "computer"
Ora proviamo a ottenere tutti gli altri valori:
<?php
echo $carrello[0]; // output -> "computer"
echo $carrello[1]; // output -> "monitor"
echo $carrello[2]; // output -> "mouse"
echo $carrello[3]; // output -> "tastiera"
echo $carrello[4]; // output -> "webcam"
Le chiavi vengono chiamate anche indici. Per questo array possiamo dire che abbiamo 5 elementi in totale, contandoli in senso assoluto, ma una serie di chiavi o indici per accedere ai vari valori che vanno da 0 a 4.
Gli array che abbiamo appena visto sono array semplici in cui la chiave o l’indice viene automaticamente definito ogni volta che aggiungiamo un elemento.
Esistono anche gli array associativi in cui siamo noi a definire le chiavi attraverso delle stringhe di testo.
Proviamo a estendere l’array di prima inserendo dei valori numerici indicando il prezzo di ogni oggetto (nota bene: scrivo il codice su più linee):
<?php
$carrello = array(
'computer' => 1200,
'monitor' => 350,
'mouse' => 16,
'tastiera' => 20,
'webcam' => 30
);
Quindi vado a definire l’accoppiata chiave valore nel costrutto array()
usando la sintassi chiave => valore
.
Questa volta, per accedere ai prezzi userò le chiavi che io stesso ho definito nell’array dentro la variabile $carrello
:
<?php
echo $carrello['computer']; // output 1200
echo $carrello['monitor']; // output 350
echo $carrello['mouse']; // output 16
echo $carrello['tastiera']; // output 20
echo $carrello['webcam']; // output 30
All’interno di un array posso definire altri array e array associativi e altri tipi di dati:
<?php
$array = array(
array(1, 2, 3, 4, 5),
array(
'nome' => 'michele',
'cognome' => 'mincone',
'età' => '20'
),
true,
false,
null,
67,
10,
6.7,
-78,
-6.4
);
Come vedi gli array sono veri e propri contenitori che possono contenere strutture dati semplici o molto complesse.
Array che contengono altri array sono detti array multidimensionali:
<?php
$array_multidimensionale = array(
array(1, 2, 3, 4),
array(5, 6, 7, 8),
array(9, 10, 11, 12),
array(13, 14, 15, 16)
);
Posso inserire tutti gli array che voglio anche dentro gli array nell’array principale.
Per poter accedere a un valore in un array multidimensionale, devo utilizzare coppie di parentesi quadre quante sono le dimensioni.
Nell’esempio di prima abbiamo un array bidimensionale perché il livello degli array arriva a un massimo di due, quindi per poter accedere al secondo valore del primo array devo scrivere:
<?php
echo $array_multidimensionale[0][1]; // output 2
Un altro modo per definire un array è usare direttamente le parentesi quadre (riprendo gli esempi di prima):
<?php
// Array semplice
$carrello1 = ['computer', 'monitor', 'mouse', 'tastiera', 'webcam'];
// Array associativo
$carrello2 = [
'computer' => 1200,
'monitor' => 350,
'mouse' => 16,
'tastiera' => 20,
'webcam' => 30
];
// Array multidimensionale
$array = [
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]
];
Gli array possono contenere tutti i tipi di dati visti fin ora: stringhe, numeri, decimali e booleani.
Keyword usata per identificare un array: array
.
Object
Gli oggetti fanno parte di un paradigma della programmazione chiamata “programmazione orientata agli oggetti“. PHP supporta questo tipo di paradigma.
Non ci addentreremo in questo nuovo argomento, ma ti introduco brevemente come è possibile definire un oggetto in PHP e accedere a un determinato valore.
Per definire un oggetto, detto anche classe, utilizzo la parola class
, poi il suo nome che decido a fantasia e infine le parentesi graffe:
<?php
class Carrello {
}
Dentro questo oggetto posso definire:
- variabili che nell’ambito degli oggetti si chiamano proprietà
- funzioni che chiameremo metodi
Ad esempio, definiamo una proprietà “totale
” e inseriamo un numero:
class Carrello {
$totale = 1800;
}
Poi definiamo un metodo con la classica sintassi per definire una funzione:
class Carrello {
$totale = 1800;
function svuota_carrello() {
echo "Il carrello è stato svuotato con successo";
}
}
Per poter accedere al valore di una proprietà o per poter eseguire un metodo devo prima istanziare la classe con la parola new
assegnando tutto a una variabile $carrello
:
$carrello = new Carrello(); // Istanzio la classe
Ora la variabile $carrello
contiene tutta la struttura dati che abbiamo definito per l’oggetto Carrello
.
Quindi posso richiamare la proprietà $totale
e il metodo svuota_carrello()
con la sintassi a freccia “->
“:
echo $carrello->totale; // output 1800
$carrello->svuota_carrello(); // output "Il carrello è stato svuotato con successo"
Nota bene: quando richiamo la proprietà $totale non inserisco il simbolo dollaro $
.
La sintassi e il concetto dietro agli oggetti può essere ostica all’inizio. Ci ritorneremo in futuro con un capitolo dedicato per approfondire al meglio questo argomento.
Tipi di dati speciali
PHP ha due tipi di dati speciali: null e resource.
Null
Serve a indicare una variabile che ha valore nullo e che quindi non ha valore.
<?php
$variabile = null;
echo $variabile; // nessun output
Resource
Il tipo di dato resource
contiene un valore con riferimento a una risorse esterna ottenuta attraverso una funzione per connettersi al database o per gestire un file.
Riconoscere il tipo di dato con var_dump()
In PHP esiste la funzione var_dump() che permette di passare come argomento una variabile per conoscerne il tipo di dato:
<?php
$testo = 'Esempio di stringa di testo';
var_dump($testo);
Risultato
string(27) "Esempio di stringa di testo"
La funzione ci darà come risultato il tipo di dato all’inizio, in questo caso è “string“. Poi tra parentesi tonde la lunghezza dei caratteri del testo e infine il valore inserito nella variabile.
Adesso prova tu stesso a eseguire la stessa operazione con altri tipi di dati come ad esempio gli array.
Type juggling
PHP in determinati contesti proverà a effettuare la conversione del tipo di dato per portare a termina l’esecuzione di un’attività, questo meccanismo è noto come type juggling.
Approfondiremo questo argomento in un altro articolo.
Type casting
Il type casting è il procedimento per il quale forziamo un valore a comportarsi come un tipo di dato che decide lo sviluppatore.
Ho introdotto questo argomento poco dopo l’inizio dell’articolo ma lo vedremo meglio in futuro.