Per convertire un valore in un altro tipo, metti il tipo tra parentesi davanti al valore: (int) "42" dà l'intero 42. La forma a funzione intval("42") fa lo stesso. Il cast non fallisce mai: il testo che non è un numero diventa 0, e una stringa che inizia con delle cifre mantiene solo quelle cifre.
I cast di PHP sono (int), (float), (string), (bool), (array) e (object). Ognuno ha anche una funzione: intval(), floatval(), strval(), boolval().
Da stringa a int: cosa restituiscono (int) e intval()
PHP legge le cifre dall'inizio della stringa, dopo aver saltato gli spazi iniziali, e si ferma al primo carattere che non fa parte di un numero. La notazione esponenziale conta come numero, un prefisso 0x no.
Nota che "12.7" diventa 12: il cast a int taglia la parte decimale, non arrotonda. Né (int) né intval() stampano qui un warning, qualunque sia l'input.
intval() con una base
intval($value, $base) legge la stringa in un altro sistema di numerazione. Con base 0, PHP guarda il prefisso: 0x per l'esadecimale, 0b per il binario, uno 0 iniziale per l'ottale.
Da float a int: troncamento, non arrotondamento
(int) scarta tutto ciò che segue il punto decimale, verso lo zero. Arrotonda prima se vuoi l'intero più vicino, e fai attenzione alle parentesi:
L'ultima coppia è la classica trappola dei float: (0.1 + 0.7) * 10 viene memorizzato come 7.999999..., quindi troncando ottieni 7. Arrotondando prima ottieni 8. La pagina sulla matematica tratta round, floor e ceil.
Cast a bool, string e array
In bool, solo una manciata di valori diventa false: 0, 0.0, "", "0", null e []. Tutto il resto è true, compresi "0.0", " " e "false".
In string, true diventa "1", mentre false e null diventano entrambi "". I float perdono lo .0 finale, e quelli molto grandi o molto piccoli usano la notazione esponenziale.
Fare il cast di un array a stringa non lo unisce. Questo stampa Tags: Array:
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
e PHP aggiunge un warning:
Warning: Array to string conversion in /home/index.php on line 3
Usa implode(", ", $array) o json_encode($array) per trasformare un array in testo.
Tutti i cast in un colpo d'occhio
Scegli un valore per vedere cosa restituiscono intval, (bool), strval, is_numeric e gettype. Ogni cella è stata calcolata da PHP 8.3.
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
Stringhe numeriche e conversione automatica
Una stringa numerica è una stringa che sembra un numero: "12", "-3.5", "1e3", con eventuali spazi attorno. PHP le converte automaticamente nei calcoli, e is_numeric() ti dice se una stringa lo è.
"12abc" + 1 dà ancora 13, ma PHP 8 stampa Warning: A non-numeric value encountered, e "abc" + 1 lancia un TypeError. Fai un cast o valida prima di fare calcoli sull'input dell'utente.
settype() e gettype()
settype() cambia il tipo di una variabile sul posto e gettype() lo riporta. get_debug_type() restituisce i nomi più brevi che vedi nei messaggi di errore (int, float, string).
La maggior parte del codice usa invece un cast ($value = (int) $value;), perché è più breve e si legge allo stesso modo.
Validare l'input invece di fare il cast
(int) non dice mai di no, quindi (int) "abc" diventa 0 in silenzio e (int) "5 apples" diventa 5. Per l'input dei form, usa filter_var con FILTER_VALIDATE_INT: restituisce l'intero oppure false.
Confronta il risultato con === false, perché 0 è un intero valido e == false lo rifiuterebbe. La pagina su filter_var mostra gli intervalli e gli altri validatori.
Domande frequenti
Come converto una stringa in int in PHP?
Usa (int) $str oppure intval($str); in base 10 danno lo stesso risultato. (int) "42" vale 42, (int) "12abc" vale 12 e (int) "abc" vale 0. Per rifiutare un input che non è un numero intero, usa filter_var($str, FILTER_VALIDATE_INT), che restituisce false invece di tirare a indovinare.
Qual è la differenza tra intval() e (int) in PHP?
In base 10 restituiscono lo stesso risultato. intval() accetta anche una base: intval('ff', 16) vale 255, e con base 0 legge prefissi come 0x, 0b e uno 0 iniziale per l'ottale. Essendo una funzione, intval si può anche passare come callback, come in array_map('intval', $values).
Cosa restituisce (bool) "0" in PHP?
false. La stringa "0" è uno dei valori falsy di PHP, insieme a "", 0, 0.0, null e []. Ogni altra stringa è true, compresi "0.0", " " e "false".
Come converto un numero in stringa in PHP?
Usa (string) $n, strval($n) oppure mettilo in una stringa: "$n". (string) 3.0 vale "3"; per un numero fisso di decimali usa number_format($n, 2) o sprintf('%.2f', $n).