Menu

Types de données PHP : int, float, string, bool, array, null

PHP a dix types : quatre scalaires (int, float, string, bool), quatre composés (array, object, callable, iterable) et deux spéciaux (null, resource). var_dump($x) montre le type et la valeur, gettype($x) renvoie le nom du type.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

PHP a huit types que vous utilisez tous les jours : int, float, string, bool, array, object, null, plus callable pour les fonctions que vous faites circuler. Une variable n'a pas de type fixe ; c'est sa valeur actuelle qui en a un. var_dump($x) montre à la fois le type et la valeur, et gettype($x) renvoie le type sous forme de chaîne.

La première colonne vient de gettype(), la seconde de get_debug_type(). Remplacez une valeur par la vôtre et relancez. Elles divergent sur quelques noms : gettype dit integer, double et boolean pour des raisons historiques, tandis que get_debug_type utilise les noms des déclarations de type (int, float, bool) et donne le nom de la classe pour un objet.

Les types PHP en un coup d'œil

TypeExempleRemarques
int42, -7, 0x1A, 1_000_000nombres entiers, 64 bits sur les systèmes modernes
float3.14, 1.5e3décimaux, inexacts comme dans tous les langages
string"hi", 'hi'une suite d'octets, pas de caractères
booltrue, falseinsensible à la casse (TRUE fonctionne aussi)
array[1, 2], ["a" => 1]map ordonnée : liste et dictionnaire à la fois
objectnew User(), new stdClass()une instance d'une classe
nullnullla seule valeur du type null ; signifie aussi « aucune valeur définie »
callable'strlen', fn($x) => $x * 2tout ce qui peut être appelé
iterableun tableau ou un objet Traversablece qu'accepte foreach
resourcele résultat de fopen()une poignée vers quelque chose d'extérieur à PHP

Inspecter des valeurs avec var_dump

var_dump est l'outil pour voir ce que vous avez vraiment. Il affiche le type, la valeur, et pour les chaînes la longueur en octets :

echo afficherait 10 pour les trois premières et cacherait la différence. La longueur dans string(5) "café" compte des octets, c'est pourquoi strlen et mb_strlen diffèrent pour du texte non ASCII.

Entiers et floats

Un entier est un nombre sans partie décimale. Les littéraux peuvent contenir des tirets bas pour la lisibilité, et s'écrire en hexadécimal, octal ou binaire. Un float est un nombre avec un point décimal ou un exposant, et comme dans tous les langages il stocke la plupart des décimaux de façon approchée :

Ne comparez jamais des floats avec == ; comparez leur différence à une petite tolérance, ou arrondissez d'abord les deux côtés. Pour de l'argent, stockez des centimes entiers.

Les booléens et les valeurs fausses

Un bool vaut true ou false. Là où PHP attend une condition (if, while, !), toute valeur est convertie en bool, et une courte liste de valeurs compte comme fausse : false, 0, 0.0, "", "0", [] et null. Tout le reste est vrai. Le tableau montre chaque valeur avec son type, sa conversion en bool et si elle est numérique :

gettype, (bool) et is_numeric pour chaque valeur de $x
Point at or tap a cell to read it as PHP.
$xgettypeboolis_numeric
0
1
-1
0.0
1.5
"0"
""
" "
"0.0"
"10"
"1e1"
"abc"
"null"
true
false
null
[]
[0]
Every cell computed by PHP 8.3.19.

Les surprises sont "0.0", " " et "null" : ce sont trois chaînes non vides différentes de "0", donc elles sont vraies, et if ($value) exécute son corps pour elles.

Tableaux, objets et null

Un tableau contient n'importe quel mélange de valeurs sous des clés entières ou de type chaîne. Un objet est une instance d'une classe ; stdClass est la classe vide de PHP pour créer des objets rapidement, et (object) transforme un tableau en objet. null signifie « aucune valeur » :

Vérifier un type avec les fonctions is_*

Chaque type a une fonction de test qui renvoie true ou false. is_numeric diffère de is_int : elle accepte aussi les chaînes numériques, ce qu'il faut pour vérifier une saisie de formulaire.

Les autres : is_bool, is_array, is_object, is_null, is_callable, is_iterable, et $x instanceof ClassName pour une classe précise.

Conversions implicites et types stricts

PHP convertit automatiquement les types quand un opérateur en attend un autre. Une chaîne numérique utilisée dans un calcul devient un nombre, et . transforme les nombres en chaînes. Une chaîne qui n'a rien de numérique ne peut pas être additionnée, et PHP 8 lève une TypeError :

Les paramètres typés convertissent aussi, sauf si le fichier commence par declare(strict_types=1);. Dans ce cas, un appel avec le mauvais type scalaire échoue au lieu d'être converti :

Pour convertir volontairement, faites un cast : (int) "42", (float) "3.5", (string) 10, (bool) "0". La page sur le transtypage couvre chaque cast et ses cas limites.

Erreur fréquente : comparer des types différents avec ==

Comme == convertit avant de comparer, deux valeurs de types différents peuvent être « égales » d'une manière qui provoque des bugs, comme "1e1" == "10" (les deux valent le nombre 10) ou null == false. Utilisez ===, qui exige aussi le même type, sauf si vous voulez la conversion :

PHP 8 a corrigé le pire cas : "abc" == 0 valait true et vaut désormais false, car une chaîne non numérique est comparée comme une chaîne. Les tableaux complets sont sur la page des opérateurs de comparaison.

Questions fréquentes

Comment vérifier le type d'une variable en PHP ?

var_dump($x) affiche le type et la valeur, par exemple int(5). gettype($x) renvoie le nom du type sous forme de chaîne ("integer"), et get_debug_type($x) renvoie le nom moderne ("int", ou le nom de la classe pour un objet). Pour tester un type précis, utilisez is_int, is_string, is_array et les autres fonctions is_*.

Pourquoi gettype renvoie-t-il "double" pour un float ?

Pour des raisons historiques, gettype() désigne les floats par "double" et les entiers par "integer". get_debug_type(), ajouté en PHP 8, renvoie "float" et "int", les mêmes noms que ceux des déclarations de type.

Quelles valeurs sont fausses en PHP ?

Converties en bool, ces valeurs valent false : false, 0, 0.0, "", "0", [] et null. Tout le reste vaut true, y compris "0.0", " " et "false".

Quel est l'entier maximal en PHP ?

PHP_INT_MAX, qui vaut 9223372036854775807 sur les systèmes 64 bits. Le dépasser ne fait pas revenir au début : le résultat devient un float et perd en précision.

PHP est-il fortement ou faiblement typé ?

PHP est typé dynamiquement et, par défaut, convertit les types quand il le peut ("10" + 5 vaut 15). Avec declare(strict_types=1); en haut d'un fichier, les appels de fonctions typées dans ce fichier refusent les mauvais types scalaires avec une TypeError au lieu de les convertir.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER