Les variables ============= * Nommage et typage * La portée des variables * Les manipulations de variables * Les constantes * Les types de données * Les tableaux * Les conversions de type Nommage et typage ----------------- * Nom des variables : - Commencent toujours par $ - Suivi par une suite de lettre, de chiffres ou de _ - Le premier caractère ne peut pas être un chiffre Les caractères -, @ ou . (le point) sont interdits dans les noms de variable. .. literalinclude:: file/variable.php :language: php Quelques horreurs à ne pas commettre. .. literalinclude:: file/variable2.php :language: php .. image:: images/error.png Intéressant: le message d’erreur fourni par PHP dans le navigateur quand on essaie de lancer le script… à condition que la variable display_errors soit à « on » dans la configuration (php.ini). * Le typage : - Pas de « déclaration » obligatoire !!!! - Type d’une variable déterminé par la valeur qu’on lui donne - Type d’une variable peut changer au cours du programme suivant les affectations * Noms des variables sont sensibles à la casse (majuscules ≠ minuscules)‏ * PHP, à l’inverse du C ou du JAVA, est un langage de typage faible et dynamique : - Faible : les variables ne doivent pas être déclarées avant d’être utilisées. - Dynamique : le type d’une variable est déterminé par la valeur qu’on lui donne, et peut donc changer au cours du programme suivant les valeurs qu’on lui affecte. Par ailleurs, l’utilisation en lecture d’une variable non initialisée n’est pas non plus un problème. Une variable inexistante renverra la valeur NULL, et n’affichera pas d’erreur (sauf si la variable error_reporting dans le php.ini est à « E_ALL »). Il faudra donc être particulièrement vigilent dans le traitement des variables, d’autant plus que les noms des variables sont « case-sensitive » (sensibles à la casse). Exemple : .. literalinclude:: file/variable3.php :language: php Ce petit exemple illustre le typage faible et dynamique. La variable $a contient tout d’abord une chaîne de caractère, puis on lui affecte un entier auquel on applique une opération arithmétique. Et PHP s’adapte: il réalise l’opération arithmétique sans sourciller, alors qu’au départ, il s’agissait bien d’une chaîne de caractère. Question : quel sera l’affichage fourni par l’exécution de ce mini-script ? La portée des variables ----------------------- Par défaut, variables « locales » (limitées dans une fonction)‏. Il existe aussi des variables « globales ». 2 méthodes pour les utiliser : - Déclarer une variable comme étant ‘global’ - Utiliser le tableau $GLOBALS La portée des variables en PHP est par défaut restreinte: on parlera de portée « locale ». Les variables ne sont visibles et lisibles que dans le contexte où elles ont été créées. Ainsi, si une variable est définie dans une fonction, elle ne sera visible que dans cette fonction; une fois l’exécution de cette fonction terminée, toutes les variables qui y ont été définies sont perdues. Si on suit cette logique, une fonction ne connaît donc que les variables qui sont créées en son sein. Il faut compléter ceci par deux remarques : * Une fonction connaît également les paramètres qui lui sont passés * Une fonction peut également récupérer des variables qui n’ont pas été définies en son sein et qui n’ont pas été passées en paramètres: ce sont les variables globales. Il faut faire attention aux variables dites « globales ». Les variables « globales » ne sont « globales » que dans la fonction où elles sont récupérées. En fait, il s’agit de variables définies en dehors de la fonction, et que la fonction peut récupérer. Pour utiliser des variables globales, deux méthodes existent : - Déclarer les variables comme étant ‘global’ dans la fonction qui veut les récupérer - Utiliser la variable tableau superglobale $GLOBALS[] .. literalinclude:: file/variableportee1.php :language: php Dans cet exemple, on voit l’utilisation de la superglobale $GLOBALS pour récupérer la valeur de la variable $msg1, qui devient du coup globale dans la fonction. **Exercice : que va afficher ce script ?** .. literalinclude:: file/variableportee2.php :language: php Dans cet exemple, on voit l’utilisation de la déclaration « global » de variable dans une fonction, pour en récupérer la valeur, sans passer par les paramètres.. Remarque : si on définit une variable dans le contexte général et qu’on définit une variable du même nom au sein d’une fonction, sans faire jouer le mécanisme de « global » ou de $GLOBALS, on a bien deux variables différentes. **Exercice : que va afficher ce script ?** .. literalinclude:: file/variableportee3.php :language: php Les manipulations de variables ------------------------------ * Test d’existence : isset( $var ) - La fonction isset() permet de savoir si une variable existe ou non, cad si on lui a affecté préalablement une valeur (fût-elle vide).‏ * Destruction : unset( $var)‏ - La fonction unset() permet de détruire une variable. Si on détruit une variable, le résultat de la fonction isset() de cette variable, sera FALSE. * Utilisation de variables variables. .. code-block:: php , ); * 5.3 const (, ); * Pas de $ devant leur nom * Ne peuvent plus recevoir d’autres valeurs * Sont accessibles de partout (// superglobale)‏ * Par convention en majuscules Les constantes sont des variables qui ne peuvent plus être modifiées. Leur valeur est donc fixée une fois pour toutes. C’est le mot-clef « define() » qui permet de définir une constante. Les constantes ne sont pas restreintes à une fonction: elles ont la visibilité du contexte général (comme le superglobales). On ne met pas de $ devant leur nom. Par convention, on les notes en majuscule. **Exemple** .. literalinclude:: file/constante.php :language: php Les types de données --------------------- * 4 types de données simples : PHP gère 4 types de données simple. Ces types sont donnés par PHP de manière dynamique selon la valeur assignée à la variable. * **Booléens (boolean) : valeur TRUE ou FALSE** Ainsi si la variable reçoit la valeur TRUE ou FALSE, elle sera de type boolean. Notez bien que TRUE ou FALSE sont insensibles à la casse (cela peut donc être true ou false). * **Entiers (integer) : base décimale, octale ou hexadécimale** Si la valeur assignée à la variable est un entier, le type de la variable sera integer. Les entiers peuvent être notés « normalement », positifs ou négatifs. Ainsi un entier commençant par un chiffre de 1 à 9 sera interprété selon la base décimale habituelle. Si le nombre entier commence par un zéro, il sera compris en base octale. S’il commence par 0x, il sera interprété en base hexadécimale. * **Nombres flottants (float, double) : nombre décimal ou avec exposant** La taille est généralement celle d’un entier signé de 32 bits. * **Chaînes de caractères (string) : entre guillemets** Les nombres à virgule flottante comporteront un « point » (séparateur décimal) ou un « e » (majuscule ou minuscule) séparant l’exposant. Selon leur taille, ils seront interprétés comme double ou comme float. * **Pour connaître le type : gettype( $var );** La fonction gettype() permet de connaître le type que PHP a assigné automatiquement à la variable. Il est également possible d’utiliser les fonctions suivantes : is_string(), is_double(), is_float(), is_int(), is_integer(), is_boolean(). Pour être tout à fait complet, il faut également mentionner : is_array(), is_null() et is_object(). **Exercice** .. literalinclude:: file/variablegettype.php :language: php * Remarques sur les string : * Les variables sont remplacées par leur valeur dans une chaîne de caractère avec des guillemets doubles (≠ guillemets simples) * Caractères d’échappement : \ Dans la manipulation des chaînes des caractères, il importe de souligner trois éléments importants : * Dans les chaînes de caractère, les variables sont bel et bien remplaces par leur valeur. Autrement dit, une variable, placée entre des guillemets, est toujours interprétée et c’est sa valeur qui est retournée * Afin de pouvoir intégrer des guillemets dans une chaîne de caractère, il est possible de « protéger » (escape) les guillemets, afin qu’ils ne soient pas confondus avec le symbole de début ou de fin de chaîne. Pour « escaper » les guillemets, il suffit de les faire précéder par un backslash (\). Le backslash doit lui-même être protégé pour pouvoir être affiché, sinon il risque de se confondre avec le caractère suivant. En effet, les séquences suivantes forment des caractères spéciaux : \n (nouvelle ligne), \r (retour chariot), \t (tabulation), \x (suivi du code hexadécimal dans la table ASCII, par exemple \x20 est le caractère espace)‏ * Remarquons qu’il est également possible de délimiter une chaîne de caractère avec des guillemets simples: les guillemets doubles ne sont alors pas considérés comme des caractères spéciaux, et ne doivent pas être « protégés ». Par contre, l’apostrophe devra alors être protégée. La différence fondamentale entre l’utilisation de guillemets doubles et de guillemets simples pour les chaînes de caractère est le suivant: alors qu’avec les guillemets doubles, les variables sont remplacées par leur valeur au sein des chaînes de caractère, ce n’est pas le cas avec des guillemets simples. Cad que echo "$a" provoque l’affichage de la valeur de la variable a, tandis que echo '$a' provoque l’affichage de « $a ». .. literalinclude:: file/variableescape.php :language: php * La syntaxe « heredoc » : .. code-block:: php <<< identifiant identifiant; La syntaxe « heredoc » permet d’inclure plusieurs lignes dans une variable de type string, sans même « protéger » (« escaper ») les guillemets (simples ou doubles). Seul le backslash devra être protégé si il y a danger de l’associer avec le caractère suivant. Il est toujours possible d’intégrer des variables (qui seront interprétées) et des caractères hexadécimaux. Ici, le \x28 et le \x29 sont respectivement les parenthèses ouvrante et fermante. .. literalinclude:: file/variableheredoc.php :language: php