Le fait qu'on ne précise pas le type d'une variable lors de sa création ne veut pas dire qu'il n'y a pas de type de données dans PHP qui supporte huit types de données et offre de nombreuses fonctions permettant de connaître un type et/ou de le changer.

### 8 types de données dans PHP

- 4 types scalaires : booléen, entier, nombre à virgule flottante, chaîne de caractères
- 2 types composés : tableau et objet
- 2 types spéciaux : ressource et null

Type | Remarque | Exemple
Booléen | Valeurs possibles : TRUE FALSE | $x = TRUE;
Entier | Valeurs possibles de -2 147 483 648 à +2 147 483 647 | $x = 12; $x = -123456;
Virgule flottante | Valeurs possibles de 1.7E-308 à 1.7E+308 | $x = 1.2345; $x = -12345.78
Chaînes | N'importe quelles valeurs entourées par des guillemets doubles ou simples | $x = "françois piat"; $x = 'is the best';
Tableaux | Un tableau PHP est une association ordonnée : des clés correspondent à des valeurs. Les clés peuvent être numériques et/ou alphabétiques. Les valeurs peuvent être de n'importe quel type. | $x[0] = "françois"; $x["nom"] = "piat"; $x[1] = 25;
Objets | Une classe est définie avec le mot-clé class et instanciée avec le mot-clé new. | class piat { function Qui () { echo "François."; } } $x = new piat; $x->Qui();
Ressource | Une ressource est une référence sur l'extérieur (représentant par exemple un pointeur de fichier). | $x = fopen("fic.txt", "r");
Null | La valeur NULL représente une variable qui n'a pas de valeur. | $x = NULL; $x = null;

Nous pouvons convertir une variable dans un certain type en utilisant la fonction settype().

Nous pouvons connaître le type d'une variable en utilisant de nombreuses fonctions.

Les valeurs booléennes TRUE et FALSE sont évaluées de la façon suivante :

- pour les valeurs numériques, 0 et 0.0 sont considérées comme FALSE, n'importe quelle autre valeur est considérée comme TRUE
- une chaîne de caractères vide est considérée FALSE,
- une chaîne de caractères non vide est considérée comme TRUE, sauf si elle est égale à "0"
- un tableau vide (ie de 0 élément) est considéré comme FALSE,
- un tableau non vide (ie ayant au moins 1 élément, quelque soit sa valeur) est considéré comme TRUE,
- un objet vide (ie sans méthode ni propriété) est considéré comme FALSE,
- un objet non vide est considéré comme TRUE,

Conclusion : les valeurs FALSE, 0, 0.0, '', '0', null, les tableaux vides et les objets vides sont considérées comme FALSE. Toutes les autres valeurs sont considérées comme TRUE.

PHP fournit les mots-clés TRUE et FALSE pour travailler avec les booléens. Ces mots-clés ne sont pas sensibles aux majuscules et aux minuscules (true, True marchent aussi). Même si TRUE et FALSE ont respectivement les valeurs 1 et chaîne vide, utilisez TOUJOURS les mots-clés pour tester les valeurs booléennes ou pour assigner une valeur booléenne.

### Gestion de la mémoire

PHP utilise le comptage de référence et la méthode "copy-on-write" pour gérer la mémoire. La méthode "copy-on-write" économise la mémoire en cas de copie de variables, et le comptage de référence permet de libérer la mémoire dès qu'une variable n'est plus utilisée.

La table des symboles

Une variable est composée de deux parties : son nom et sa valeur. La table des symboles est un tableau qui associe le nom d'une variable, et la position de sa valeur dans la mémoire (ie son adresse).

Quand on copie la valeur d'une variable dans une autre variable, PHP n'alloue pas une nouvelle partie de la mémoire pour la copie de la valeur. Il se contente de modifier la table des symboles en faisant pointer les deux noms de variable sur le même espace mémoire.
Par exemple dans le code suivant :
$personnes = array("Pierre","Paul","Jacques");
$prenoms = $personnes ;
Le tableau $personnes n'est pas dupliqué dans la mémoire par l'instruction $prenoms = $personnes.
C'est seulement si nous modifions $prenoms ou $personnes :
$prenoms[0] = "François";
que PHP alloueras de la mémoire et fera la copie de la zone.

Chaque valeur pointée dans la table des symboles a un compteur de référence, qui représente le nombre de variables permettant d'accéder à cette valeur. Aprés l'assignement initial des variables $personnes et $prenoms, la zone pointée en mémoire aura un compteur de référence égale à deux. Quand la variable $prenom est modifiée, une nouvelle zone est créée en mémoire, et le compteur de référence des deux zones est passé à 1.
Quand une variable devient hors de portée (sortie d'une fonction par exemple), le compteur de référence de sa valeur est décrémenté de 1. Si la valeur du compteur est égal à 0, alors la mémoire est libérée par PHP.

Si vous utilisez des variables avec des valeurs de grandes dimensions (chaînes de caractères très longues, tableaux avec de nombreuses entrées), vous pouvez aussi libérer implicitement de la mémoire (quand vous n'avez plus besoin de vos variables :-)) en utilisant la fonction unset(). La fonction isset() permet de savoir si une variable est définie (si une valeur lui est affectée).

Exemple : variable définie ou non
<!DOCTYPE html> <html lang="fr"> <head><title>variables définies ou non</title></head> <body> <?php TestVariable($x); // la variable x n'est pas définie $x = 100; // assignation d'un valeur TestVariable($x); $x = ''; // assignation d'une chaîne vide TestVariable($x); $x = NULL; // assignation de la valeur null TestVariable($x); unset($x); // suppression de la variable TestVariable($x); //------------------------------------------------------ function TestVariable($laVar) { if (isset($laVar)) { echo '<p>La variable a la valeur ', $laVar; } else { echo '<p>La variable n\'est pas définie'; } }?> </body> </html>

### Evaluation d'une variable

L'évaluation d'une variable, générée par un script ou venant de la saisie d'un utilisateur est parfois plus difficile qu'on ne le pense.

Nous considérerons les différentes valeurs possibles suivantes :
- une chaîne de caractères 'abcd'
- une valeur numérique 1234
- une chaîne vide ''
- les entiers 1 et 0
- les valeurs booléennes TRUE et FALSE
- la valeur NULL
- une valeur non affectée.

Les valeurs saisies par un utilisateur dans un formulaire sont toujours considérées comme des chaînes de caractères quand elles sont récupérées par le script PHP au travers des tableaux $_POST ou $_GET.
Même si l'utilisateur saisi 0 (zéro), cette valeur sera traitée comme une chaîne de caractères pour l'évaluation.
Un tableau ou une variable texte venant d'un formulaire à travers des cases à cocher ou des boutons radio pourra être indéfini (unset) si l'utilisateur n'a pas coché les cases. Par contre une zone texte (<input type="text"> ou <textarea>) ne sera jamais indéfinie. Si l'utilisateur n'y saisit rien, la variable contiendra une chaîne vide ('').
Les valeurs TRUE, FALSE et NULL ne peuvent pas venir de la saisie d'un utilisateur.

La variables générées par un script peuvent prendre toutes les valeurs énoncées.

Nous utiliserons les opérateurs et fonctions suivantes pour tester la valeur des variables :

- if (! $var) : $var n'est pas évaluée à TRUE
- if (empty($var)) : $var est vide (cf. empty())
- if ($var == '') : $var est vide
- if ($var === '') : $var est de type chaîne et vide
- if (isset($var)) : $var contient une valeur
- if (strlen($var) == 0) : la longueur de $var est de 0
- if (is_string($var)) : $var est une chaîne

Le tableau suivant montre le résultat des évaluations des différentes valeurs avec les différentes méthodes :

| 'abcd' | 1234 | '' | 0 | 1 | FALSE | NULL | unset
! $var | faux | faux | vrai | vrai | faux | vrai | vrai | vrai
empty($var) | faux | faux | vrai | vrai | faux | vrai | vrai | vrai
$var == '' | faux | faux | vrai | vrai | faux | vrai | vrai | vrai
$var === '' | faux | faux | vrai | faux | faux | faux | faux | faux
isset($var) | vrai | vrai | vrai | vrai | vrai | vrai | faux | faux
strlen($var) == 0 | faux | faux | vrai | faux | faux | vrai | vrai | vrai
is_string($var) | vrai | faux | vrai | faux | faux | faux | faux | faux

Le tableau montre des résultats parfois surprenants :

- pour des valeurs comme 0, FALSE ou NULL, les tests de fausseté (! $var) et de vide (empty()) renvoient vrai.
- un test comme strlen($var) == 0) renvoie faux pour 0, mais vrai pour FALSE
- les tests de fausseté (! $var) et de vide (empty()) ou ($var == '') sont totalement interchangeables : tous retourne vrai pour une variable vide ou non existante (unset), mais aussi pour 0 ou FALSE.

Quelques conclusions :

- quand on teste une variable dont on n'est pas sûr qu'elle soit affectée, il faut d'abord la tester avec isset() ou empty() avant de faire d'autres tests car ces fonctions ne génèrent pas d'alerte si la variable n'existe pas.
- il faut plutôt faire des comparaisons strictes (avec l'opérateur ===) que des comparaisons sans tenir compte du type.
- il faut toujours utiliser les mots-clés TRUE et FALSE pour les booléens et non les valeurs 0 et 1.