Tipi di dati in PHP: stringhe, numeri, array e molto altro

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.

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:

tutti i tipi di dati in PHP: string, int, float, bool, array, objects, callable, iterable, null e resource

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.