Nicolas KEMPF

Nicolas KEMPF / Développement  / Les variables en PHP

Les variables en PHP

Nommage

En PHP, les variables commencent par un $ puis un nom respectant un pattern similaire à toutes les autres entités PHP :

  • premier caractère : une lettre , de a à z en majuscule ou minuscule, plus tous les caractères ASCII des codes 127 (0x7f) à 255 (0xff) ou un _
  • suite : un ensemble de lettres (comme au dessus), _ ou chiffres.

Si ce n’est pas clair, l’expression régulière suivante représente le pattern à respecter :

[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Définition

En PHP, il est inutile de définir ses variables. Il n’y a aucune différence entre une variable définie mais non initialisée et une variable non définie. Ici, $c n’est pas défini, en essayant d’y accéder, on obtient la valeur par défaut en fonction du contexte ainsi qu’une erreur Notice: Undefined variable: c. Malgré la définition de $d, on obtient le même comportement : valeur par défaut + erreur.

var_dump($c); // NULL

$d;
var_dump($d);// NULL

Assignation

Pour assigner une valeur à une variable, PHP utilise le symbole = :

$var = 3;

Le langage supporte la décomposition de tableaux non associatifs via list() :

list($v1, $v2, $v3) = array(1, 2, 3, 4);

Il est possible de récupérer dans des variables le contenu d’un tableau associatif et d’un object (en le castant en tableau) avec la fonction extract(). Attention, son fonctionnement est un peu particulier:

extract() crée des variables à partir des noms des clés du tableau et leur assigne la valeur correspondante. Il n’est pas possible de choisir directement les clés que l’on veut récupérer, c’est automatiquement l’intégralité du tableau.

extract(['a' => 2, 'b' => 3, 'd' => 8]);

Portée

En PHP, la règle concernant la portée des variables est simple.

Elle ne tient pas compte du fichier où est déclarée la variable. $a est définie dans un fichier mais est utilisable par tous les fichiers inclus.

$a = 2;
include 'suite.php'; // $a est définie dans suite.php

Une nouvelle portée est créée à l’intérieur des fonctions. inspect() ne va rien afficher, $a est définie dans la portée globale et n’est pas définie à l’intérieur de cette fonction. new_inspect() va afficher 5.

$a = 2;

function inspect() {
    var_dump($a);
}

function new_inspect() {
    $a = 5;
    var_dump($a);
}

Le mot-clef global permet de dire à PHP de considérer la variable comme celle définie dans la portée globale. De cette façon, notre var_dump($a) va afficher 2. De plus, toute modification apportée à $a dans la fonction va modifier la variable $a définie dans la portée globale. Cela s’explique par le fait que global $a ne copie pas la valeur de $a mais va contenir une référence à la variable $a de la portée globale.

$a = 2;

function inspect() {
    global $a;
    var_dump($a);
}

Les variables superglobales sont disponibles partout.$GLOBALS est un tableau associatif dans lequel est définie toutes les variables définies dans la portée globale.

$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV

Le mot-clef use utilisé dans la définition d’une closure (fonction anonyme) permet à celle-ci d’accéder à une (ou plusieurs) variable de la portée parente. Ici, inspect va afficher 5. L’exemple est assez stupide, bien souvent dans un tel cas on va définir notre fonction avec un paramètre et lui passer $a.

$a = 5;

$inspect = function() use($a) {
    var_dump($a);
};

L’utilisation la plus courante de use est le passage de variables supplémentaires dans le cas d’une fonction anonyme passée en paramètre d’une fonction. L’exemple classique est l’utilisation d’une variable comme filtre d’un tableau.

$arr = [1, 2, 3, 4];
$filter = 3;
$arr = array_filter($arr, function($elt) use($filter) {
    return $elt === $filter;
});
var_dump($arr);