Les variables Essentiel En PHP, les variables sont représentées par un signe dollar "$" suivi du nom de la variable. Le nom est sensible à la casse. Les noms de variables suivent les mêmes règles de nommage que les autres entités PHP. Un nom de variable valide doit commencer par une lettre ou un souligné (_), suivi de lettres, chiffres ou soulignés. Exprimé sous la forme d'une expression régulière, cela donne : ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$ Dans nos propos, une lettre peut être a-z, A-Z, et les octets de 128 à 255 (0x80-0xff). $this est une variable spéciale, qui ne peut pas être assignée. Avant PHP 7.1.0, l'affectation indirecte (i.e. en utilisant les variables variables) était impossible. &tip.userlandnaming; Pour obtenir des informations sur une variable, voyez les fonctions dédiées aux variables. Validité des noms de variables ]]> Les variables sont toujours assignées par valeur. C'est-à-dire, lorsque vous assignez une expression à une variable, la valeur de l'expression est recopiée dans la variable. Cela signifie, par exemple, qu'après avoir assigné la valeur d'une variable à une autre, modifier l'une des variables n'aura pas d'effet sur l'autre. Pour plus de détails sur ce genre d'assignation, reportez-vous aux expressions. PHP permet aussi d'assigner les valeurs aux variables par référence. Cela signifie que la nouvelle variable ne fait que référencer (en d'autres termes, "devient un alias de", ou encore "pointe sur") la variable originale. Les modifications de la nouvelle variable affecteront l'ancienne et vice versa. Pour assigner par référence, ajoutez simplement un & (ET commercial) au début de la variable qui est assignée (la variable source). Dans l'exemple suivant, Mon nom est Pierre s'affichera deux fois : Assignation de référence ]]> Une chose importante à noter est que seules les variables nommées peuvent être assignées par référence. Assignation de référence et variables anonymes ]]> Il n'est pas nécessaire d'initialiser les variables en PHP, cependant, cela reste une excellente pratique. Les variables non initialisées ont une valeur par défaut selon leur type - &false; pour les booléens, zéro pour les entiers et les réels, chaîne vide pour les chaînes de caractères (comme utilisée avec echo) ou un tableau vide pour les tableaux. Valeurs par défaut des variables non initialisées 25 var_dump($unset_int); // Utilisation d'un entier/double; retourne 'float(1.25)' $unset_float += 1.25; var_dump($unset_float); // Utilisation d'un tableau : retourne array(1) { [3]=> string(3) "def" } $unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def") var_dump($unset_arr); // Utilisation d'un objet; crée un nouvel objet stdClass (voir http://www.php.net/manual/fr/reserved.classes.php) // Retourne : object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } $unset_obj->foo = 'bar'; var_dump($unset_obj); ?> ]]> Utiliser la valeur par défaut d'une variable non initialisée est problématique lorsque vous incluez un fichier dans un autre qui utilise le même nom de variable. Une erreur de niveau E_NOTICE sera émise lorsque vous travaillerez avec des variables non initialisées, cependant, aucune erreur ne sera lancée lorsque vous tenterez d'insérer un élément dans un tableau non initialisé. La structure de langage isset peut être utilisée pour détecter si une variable a déjà été initialisée. Variables pré-définies PHP fournit un grand nombre de variables pré-définies. Cependant, beaucoup de ces variables ne peuvent pas être présentées ici, car elles dépendent du serveur sur lequel elles tournent, de la version et de la configuration du serveur ou encore d'autres facteurs. Certaines de ces variables ne seront pas accessibles lorsque PHP fonctionne en ligne de commande. Pour plus de détails voir la liste des variables pré-définies. PHP fournit aussi un jeu de tableaux pré-définis contenant les variables du serveur (si possible), les variables d'environnement et celles d'entrées. Ces tableaux sont un peu particuliers, car ils sont automatiquement globaux, c.à.d qu'ils sont automatiquement disponibles dans toutes les portées d'exécution. Pour cette raison, ils sont dits 'superglobaux'. (il n'y a pas de mécanisme en PHP pour créer de telles variables.) Pour plus de détails voir la liste des superglobales. Variables variables Les superglobales ne peuvent pas être utilisées comme variables dynamiques dans les fonctions ou les méthodes des classes. Si certaines variables de ne sont pas définies, leur tableau pré-défini PHP correspondant est laissé vide. Portée des variables La portée d'une variable dépend du contexte dans lequel la variable est définie. Pour la majorité des variables, la portée concerne la totalité d'un script PHP. Mais, lorsque vous définissez une fonction, la portée d'une variable définie dans cette fonction est locale à la fonction. Par exemple : Les variables sont locales à la fonction ]]> Ici, la variable $a sera accessible dans le script inclus b.inc. Cependant, dans les fonctions définies par l'utilisateur, une nouvelle définition de cette variable sera donnée, limitée à la fonction. Toute variable utilisée dans une fonction est, par définition, locale. Par exemple : ]]> Le script n'affichera rien à l'écran car l'instruction echo utilise la variable locale $a, et celle-ci n'a pas été assignée préalablement dans la fonction. Vous pouvez noter que ce concept diffère un petit peu du langage C dans lequel une variable globale est automatiquement accessible dans les fonctions, à moins d'être redéfinie localement dans la fonction. Cela peut poser des problèmes si vous redéfinissez des variables globales localement. En PHP, une variable globale doit être déclarée à l'intérieur de chaque fonction afin de pouvoir être utilisée dans cette fonction. Le mot clé <literal>global</literal> Commençons par un exemple avec global : Exemple avec <literal>global</literal> Le script ci-dessus va afficher la valeur 3. En déclarant globales les variables $a et $b locales de la fonction somme(), toutes les références à ces variables concerneront les variables globales. Il n'y a aucune limite au nombre de variables globales qui peuvent être manipulées par une fonction. Une deuxième méthode pour accéder aux variables globales est d'utiliser le tableau associatif pré-défini $GLOBALS. Le précédent exemple peut être réécrit de la manière suivante : Les variables globales et <varname>$GLOBALS</varname> ]]> Le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clé et les valeurs des éléments du tableau comme valeur des variables. Notez que $GLOBALS existe dans tous les contextes, car $GLOBALS est un superglobal. Voici un exemple des super globaux : Exemple montrant les superglobales et la portée ]]> L'utilisation du mot clé global à l'extérieur d'une fonction n'est pas une erreur. Il peut être utilisé si le fichier est inclus depuis l'intérieur d'une fonction. Utilisation des variables <literal>static</literal> Une autre caractéristique importante de la portée des variables est la notion de variable static. Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. Prenons l'exemple suivant : Les variables statiques ]]> Cette fonction est un peu inutile car à chaque fois qu'elle est appelée, elle initialise $a à 0 et affiche "0". L'incrémentation de la variable ($a++) ne sert pas à grand chose, car dès que la fonction est terminée, la variable $a disparaît. Pour faire une fonction de comptage utile, c'est-à-dire qui ne perdra pas la trace du compteur, la variable $a est déclarée comme une variable statique : Les variables statiques (2) ]]> Maintenant, la variable $a est initialisée uniquement lors du premier appel à la fonction et, à chaque fois que la fonction test() est appelée, elle affichera une valeur de $a incrémentée de 1. Les variables statiques sont essentielles lorsque vous faites des appels récursifs à une fonction. Une fonction récursive est une fonction qui s'appelle elle-même. Il faut faire attention lorsque vous écrivez une fonction récursive car il est facile de faire une boucle infinie. Vous devez vérifier que vous avez bien une condition qui permet de terminer votre récursivité. La fonction suivante compte récursivement jusqu'à 10, en utilisant la variable $count pour savoir quand il faut s'arrêter : Les variables statiques et la récursivité ]]> Les variables statiques peuvent être assignées des valeurs qui sont issue d'expression constante, mais les expressions dynamique, tel que les appels de fonctions, résulteront en une erreur d'analyse. Déclaration de variables statiques ]]> À partir de PHP 8.1.0, lorsqu'une méthode utilisant des variables statiques est héritée (mais pas surchargée), la méthode héritée partage désormais les variables statiques avec la méthode parente. Cela signifie que les variables statiques dans les méthodes se comportent désormais de la même manière que les propriétés statiques. Utilisation de variables statiques dans les méthodes héritées Les déclarations statiques sont résolues au moment de la compilation. Les références avec les variables <literal>global</literal> et <literal>static</literal> PHP implémente les modificateurs de variables static et global, en terme de référence. Par exemple, une vraie variable globale est importée dans un contexte de fonction avec global. Cette commande crée en fait une référence sur la variable globale. Cela peut vous mener à des comportements inattendus, par exemple : ]]> &example.outputs; Un comportement similaire s'applique à la commande static. Les références ne sont pas stockées dynamiquement : property)) { $obj->property = 1; } else { $obj->property++; } return $obj; } function &get_instance_noref() { static $obj; echo 'Static object: '; var_dump($obj); if (!isset($obj)) { $new = new stdclass; // Assign the object to the static variable $obj = $new; } if (!isset($obj->property)) { $obj->property = 1; } else { $obj->property++; } return $obj; } $obj1 = get_instance_ref(); $still_obj1 = get_instance_ref(); echo "\n"; $obj2 = get_instance_noref(); $still_obj2 = get_instance_noref(); ?> ]]> &example.outputs; int(1) } ]]> Ces exemples illustrent les problèmes rencontrés lors de l'assignation de référence à des variables statiques, qui sont oubliées lorsque vous appelez &get_instance_ref() une seconde fois. Les variables dynamiques Il est pratique d'avoir parfois des noms de variables qui sont variables. C'est-à-dire un nom de variable qui est affecté et utilisé dynamiquement. Une variable classique est affectée avec l'instruction suivante : ]]> Une variable dynamique prend la valeur d'une variable et l'utilise comme nom d'une autre variable. Dans l'exemple ci-dessous, bonjour peut être utilisé comme le nom d'une variable en utilisant le "$$" précédent la variable. C'est-à-dire : ]]> À ce niveau, deux variables ont été définies et stockées dans l'arbre des symboles PHP : $a avec comme valeur "bonjour" et $bonjour avec comme valeur "monde". Alors, l'instruction : ]]> produira le même affichage que : ]]> c'est-à-dire : bonjour monde. Afin de pouvoir utiliser les variables dynamiques avec les tableaux, vous avez à résoudre un problème ambigu. Si vous écrivez $$a[1], l'analyseur a besoin de savoir si vous parler de la variable qui a pour nom $a[1] ou bien si vous voulez l'index [1] de la variable $$a. La syntaxe pour résoudre cette ambiguïté est la suivante : ${$a[1]} pour le premier cas et ${$a}[1] pour le deuxième. On peut également accéder aux propriétés d'une classe en utilisant les noms des variables. Le nom de la variable sera résolu en utilisant la portée depuis laquelle l'appel s'effectue. Par exemple, si vous avez une expression de la forme $foo->$bar, alors la portée locale sera examinée pour $bar et sa valeur sera utilisée comme nom pour la propriété de $foo. Ce comportement reste valide si $bar est un tableau. Les accolades peuvent aussi être utilisées, pour clairement délimiter le nom de la propriété. Ceci est utile lors de l'accès à des valeurs d'une propriété qui contient un tableau, lorsque le nom de la propriété est composé de plusieurs parties, ou lorsque le nom de la propriété contient des caractères non valides (i.e. depuis la fonction json_decode ou SimpleXML). Exemple de propriété variable $bar . "\n"; echo $foo->{$baz[1]} . "\n"; $start = 'b'; $end = 'ar'; echo $foo->{$start . $end} . "\n"; $arr = 'arr'; echo $foo->{$arr[1]} . "\n"; ?> ]]> &example.outputs; I am bar. I am bar. I am bar. I am r. Notez que les variables dynamiques ne peuvent pas être utilisées avec les tableaux Superglobaux dans une fonction ou une classe. La variable $this est aussi une variable spéciale qui ne peut être référencée dynamiquement. Variables externes à PHP Formulaires HTML (GET et POST) Lorsqu'un formulaire est envoyé à un script PHP, toutes les variables du formulaire seront automatiquement disponibles dans le script. Il y a peu de façon pour récupérer ces informations, par exemple : Exemple avec un formulaire simple Nom :
Email:
]]>
Il y a que deux façons d'accéder aux données provenant d'un formulaire HTML. Les méthodes disponible actuellement sont décrites ci-dessous : Accéder simplement à des variables de formulaires POST ]]> Utiliser un formulaire de type GET est similaire, hormis le fait que vous deviez utiliser les variables pré-définies de GET à la place. GET s'applique aussi à la QUERY_STRING (les informations disponibles après le '?' dans une URL). De ce fait, par exemple, http://www.example.com/test.php?id=3 contient les données de GET, qui sont accessibles via $_GET['id']. Voyez aussi $_REQUEST. Les points et les espaces dans les noms de variables sont convertis en underscores. Par exemple, <input name="a.b" /> deviendra $_REQUEST["a_b"]. PHP comprend aussi les tableaux dans le contexte des formulaires. (voir aussi la FAQ). Vous pouvez, par exemple, grouper des variables ensemble ou bien utiliser cette fonctionnalité pour lire des valeurs multiples d'un menu déroulant. Par exemple, voici un formulaire qui se poste lui-même des données, et les affiche : Variables de formulaires complexes '; echo htmlspecialchars(print_r($_POST, true)); echo ''; } ?>
Name:
Email:
Beer:

]]>
Si le nom d'une variable externe commence par une syntaxe valide pour un tableau, les caractères qui suivent sont silencieusement ignorés. Par example : <input name="foo[bar]baz"> deviens $_REQUEST['foo']['bar']. Nom de variables IMAGE de type SUBMIT Lors de la soumission d'un formulaire, il est possible d'utiliser une image au lieu d'un bouton standard, comme ceci : ]]> Lorsque l'utilisateur clique sur cette image, le formulaire associé est envoyé au serveur, avec deux données supplémentaires, sub_x et sub_y. Elles contiennent les coordonnées du clic de l'utilisateur dans l'image. Vous noterez que ces variables sont envoyées par le navigateur avec un point dans leur nom, mais PHP convertit ces points en soulignés.
Cookies HTTP PHP supporte les cookies HTTP de manière totalement transparente, comme défini dans la RFC 6265. Les cookies sont un mécanisme permettant de stocker des données sur la machine cliente à des fins d'identification de l'utilisateur. Vous pouvez établir un cookie grâce à la fonction setcookie. Les cookies font partie intégrante des en-têtes HTTP et donc la fonction setcookie doit être appelée avant que le moindre affichage ne soit envoyé au navigateur. C'est la même restriction que pour la fonction header. Les données contenus dans les cookies sont alors disponibles dans les tableaux de cookies appropriés, comme $_COOKIE mais aussi $_REQUEST. Lisez la page de la documentation sur la fonction setcookie pour plus de détails ainsi que des exemples. Depuis PHP 7.2.34, 7.3.23 et 7.4.11, respectivement, les noms des cookies entrantes ne sont plus url-décodés, et ce, pour des raisons de sécurité. Si vous souhaitez assigner plusieurs valeurs à un seul cookie, vous devez l'assigner sous forme de tableau. Par exemple : ]]> Cela va créer deux cookies distincts bien que MyCookie est maintenant un simple tableau dans votre script. Si vous voulez définir seulement un cookie avec plusieurs valeurs, utilisez la fonction serialize ou explode sur la première valeur. Il est à noter qu'un cookie remplace le cookie précédent par un cookie de même nom tant que le chemin ou le domaine sont identiques. Donc, pour une application de panier, vous devez implémenter un compteur et l'incrémenter au fur et à mesure. C'est-à-dire : Exemple avec <function>setcookie</function> ]]> Cas des points dans les noms de variables Typiquement, PHP ne modifie pas les noms des variables lorsqu'elles sont passées à un script. Cependant, il faut noter que les points (.) ne sont pas autorisés dans les noms de variables PHP. Pour cette raison, jetez un oeil sur : ]]> Dans ce cas, l'analyseur croit voir la variable nommée $varname, suivie par l'opérateur de concaténation, et suivie encore par la chaîne sans guillemets (une chaîne sans guillemets et qui n'a pas de signification particulière). Visiblement, ce n'est pas ce qu'on attendait... Pour cette raison, il est important de noter que PHP remplacera automatiquement les points des noms de variables entrantes par des soulignés. Détermination du type des variables Parce que PHP détermine le type des variables et les convertit (généralement) comme il faut, ce n'est pas toujours le type de variable que vous souhaitez. PHP inclut des fonctions permettant de déterminer le type d'une variable : gettype, is_array, is_float, is_int, is_object et is_string. Lisez également le chapitre sur les types. HTTP étant un protocole texte, la plupart, sinon tous, le contenu qui vient dans les tableaux Superglobaux, comme $_POST et $_GET restera en tant que chaînes. PHP n'essaiera pas de convertir des valeurs en un type spécifique. Dans l'exemple ci-dessous, $_GET["var1"] contiendra la chaîne "null" et $_GET["var2"], la chaîne "123". &reftitle.changelog; &Version; &Description; 7.2.34, 7.3.23, 7.4.11 Les noms des cookies entrantes ne sont plus url-décodés, et ce, pour des raisons de sécurité.