Les variablesEssentiel
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é global
Commençons par un exemple avec global :
Exemple avec global
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 $GLOBALS
]]>
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 static
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 global et static
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 à PHPFormulaires 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 '';
}
?>
]]>
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 setcookie
]]>
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é.