4- Les types de données

Comme nous l’avons dit précédemment, les types principaux utilisés en PHP sont : bool, int, float, object (dépend du nom de la classe), string et array (collections de données).

Comme vu précédemment, il possible de convertir une variable d’un type vers un autre. Par exemple, si une chaîne de caractères vaut “5”, il est possible de la “cast” en entier avec un opérateur de cast ou une fonction native de PHP.

Comme le langage PHP est nativement faiblement typé, il est important de connaître un opérateur de comparaison de type (les autres opérateurs de comparaison seront vus plus tard). Dans les langages fortement typés, on ne peut pas comparer des types différents (par exemple un entier et une chaîne de caractères car cela n’a aucun sens) car cela déclenche une erreur.

En PHP, les variables que l’on utilise ne sont pas forcément typées (déclarées en tant que variable d’un type) avant de les comparer. Le langage, historiquement, essaie de transtyper automatiquement les valeurs : par exemple si l’on compare 5 (int) et “5” (string), le langage renverra vrai (pour lui les valeurs sont égales). Même chose si l’on compare 0 et false.

Néanmoins, cela ne fonctionne que lorsqu’on compare avec l’opérateur ==, car la comparaison se fait sur la valeur uniquement.

On peut également comparer les variables sur leur valeur ET leur type : on utilise alors l’opérateur ===. Ainsi 0 === false renvoie faux alors que 0 == false renvoie vrai.

Exemple :

$a = "1";
$b = 1;
var_dump($a == $b); // affiche : bool(true)
var_dump($a === $b); // affiche : bool(false)

Dans cet exemple, nous comparons un entier et une chaîne de caractères qui ont la même valeur mais pas le même type : la comparaison des valeurs renvoie vrai mais la comparaison valeur + type renvoie faux.

Pour que la deuxième comparaison renvoie vrai, il aurait fallu cast $a en entier ou $b en string.

Comme nous l’avons vu précédemment, il n’est pas possible de typer la variable explicitement, mais PHP assimile une chaîne entre guillemets comme un string, un nombre sans guillemets comme un entier, un nombre à virgule sans guillemets comme un float etc… Il est également possible de typer les données avec les types de retour des fonctions : si j’indique que ma fonction addition prend deux entiers en paramètre et qu’elle retourne un entier, si j’affecte le retour de cette fonction à une variable, le langage saura que cette variable sera de type entier sans même vérifier. Dans ce cas, je n’aurais même pas à vérifier que les paramètres de ma fonction seront bien des entiers puisque le langage signalera une erreur si je passe un autre type.

Exemple d’initialisation typée :

function addition(int $a, int $b) : int
{
   return $a+$b;
}
$c = addition(5, 3);

Malheureusement, dans PHP, on ne peut pas encore typer les contenu des collections, ni transtyper les objets, et cela peut-être source d’erreurs. En général mieux vaut déclarer le plus possible les types des variables pour éviter des incohérences ou des erreurs.