PHP ha otto tipi che usi tutti i giorni: int, float, string, bool, array, object, null, più callable per le funzioni che passi in giro. Una variabile non ha un tipo fisso; ce l'ha il suo valore attuale. var_dump($x) mostra sia il tipo sia il valore, e gettype($x) restituisce il tipo come stringa.
La prima colonna è gettype(), la seconda get_debug_type(). Sostituisci un valore con uno tuo ed esegui di nuovo. Su alcuni nomi non sono d'accordo: gettype dice integer, double e boolean per ragioni storiche, mentre get_debug_type usa i nomi delle dichiarazioni di tipo (int, float, bool) e per un oggetto restituisce il nome della classe.
I tipi PHP in breve
| Tipo | Esempio | Note |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | numeri interi, a 64 bit sui sistemi moderni |
float | 3.14, 1.5e3 | decimali, inesatti come in ogni linguaggio |
string | "hi", 'hi' | una sequenza di byte, non di caratteri |
bool | true, false | non distingue maiuscole (funziona anche TRUE) |
array | [1, 2], ["a" => 1] | mappa ordinata: lista e dizionario insieme |
object | new User(), new stdClass() | un'istanza di una classe |
null | null | l'unico valore di tipo null; anche "nessun valore impostato" |
callable | 'strlen', fn($x) => $x * 2 | qualsiasi cosa si possa chiamare |
iterable | un array o un oggetto Traversable | ciò che foreach accetta |
resource | il risultato di fopen() | un handle verso qualcosa fuori da PHP |
Ispezionare i valori con var_dump
var_dump è lo strumento per vedere cosa hai davvero. Stampa il tipo, il valore e, per le stringhe, la lunghezza in byte:
echo stamperebbe 10 per i primi tre e nasconderebbe la differenza. La lunghezza in string(5) "café" conta i byte, ed è per questo che strlen e mb_strlen danno risultati diversi per il testo non ASCII.
Interi e float
Un intero è un numero senza decimali. I letterali possono usare gli underscore per leggibilità, e la notazione esadecimale, ottale e binaria. Un float è qualsiasi numero con il punto decimale o un esponente, e come in ogni linguaggio memorizza la maggior parte dei decimali in modo approssimato:
Non confrontare mai i float con ==; confronta la differenza con una piccola tolleranza, oppure arrotonda prima entrambi i lati. Per i soldi, memorizza i centesimi come interi.
Booleani e quali valori sono false
Un bool è true o false. Dove PHP si aspetta una condizione (if, while, !), qualsiasi valore viene convertito in bool, e un breve elenco di valori conta come falso: false, 0, 0.0, "", "0", [] e null. Tutto il resto è vero. La tabella mostra ogni valore con il suo tipo, la conversione in bool e se è numerico:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
Le sorprese sono "0.0", " " e "null": tutte e tre sono stringhe non vuote diverse da "0", quindi sono vere, e if ($value) esegue il suo corpo per loro.
Array, oggetti e null
Un array contiene un mix qualsiasi di valori sotto chiavi intere o stringa. Un oggetto è un'istanza di una classe; stdClass è la classe vuota di PHP per oggetti al volo, e (object) trasforma un array in uno di essi. null significa "nessun valore":
Verificare un tipo con le funzioni is_*
Ogni tipo ha una funzione di test che restituisce true o false. is_numeric è diversa da is_int: accetta anche le stringhe numeriche, che è ciò che vuoi quando controlli l'input di un form.
Altre: is_bool, is_array, is_object, is_null, is_callable, is_iterable, e $x instanceof ClassName per una classe specifica.
Conversione automatica e strict types
PHP converte i tipi automaticamente quando un operatore ne richiede uno diverso. Una stringa numerica usata in un calcolo diventa un numero, e . trasforma i numeri in stringhe. Una stringa che non è affatto numerica non si può sommare, e PHP 8 lancia un TypeError:
Anche i parametri tipizzati convertono, a meno che il file non inizi con declare(strict_types=1);. In quel caso una chiamata con il tipo scalare sbagliato fallisce invece di essere convertita:
Per convertire di proposito, fai un cast: (int) "42", (float) "3.5", (string) 10, (bool) "0". La pagina sul type casting tratta ogni cast e i suoi casi limite.
Errore comune: confrontare tipi diversi con ==
Siccome == converte prima di confrontare, due valori di tipo diverso possono risultare "uguali" in modi che causano bug, come "1e1" == "10" (entrambi sono il numero 10) o null == false. Usa ===, che richiede anche lo stesso tipo, a meno che tu non voglia la conversione:
PHP 8 ha corretto il caso peggiore: "abc" == 0 prima era true e ora è false, perché una stringa non numerica viene confrontata come stringa. Le tabelle complete sono nella pagina sugli operatori di confronto.
Domande frequenti
Come verifico il tipo di una variabile in PHP?
var_dump($x) stampa tipo e valore, per esempio int(5). gettype($x) restituisce il nome del tipo come stringa ("integer"), e get_debug_type($x) restituisce il nome moderno ("int", oppure il nome della classe per gli oggetti). Per controllare un tipo preciso, usa is_int, is_string, is_array e le altre funzioni is_*.
Perché gettype restituisce "double" per un float?
Per ragioni storiche gettype() riporta i float come "double" e gli interi come "integer". get_debug_type(), aggiunta in PHP 8, restituisce "float" e "int", gli stessi nomi che scrivi nelle dichiarazioni di tipo.
Quali valori sono false in PHP?
Convertiti in bool, sono false questi: false, 0, 0.0, "", "0", [] e null. Tutto il resto è true, compresi "0.0", " " e "false".
Qual è l'intero massimo in PHP?
PHP_INT_MAX, che vale 9223372036854775807 sui sistemi a 64 bit. Superarlo non fa ricominciare da capo: il risultato diventa un float e perde precisione.
PHP è fortemente o debolmente tipizzato?
PHP è a tipizzazione dinamica e, di default, converte i tipi quando può ("10" + 5 vale 15). Con declare(strict_types=1); in cima a un file, le chiamate a funzioni tipizzate in quel file rifiutano i tipi scalari sbagliati con un TypeError invece di convertirli.