Statamic Peak

Article

Focus détaillé : les variables PHP

Je vous présente tout ce qu'il y a à savoir sur 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 d'une variable PHP

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 d'une variable PHP

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';

Une nouvelle portée est créée à l'intérieur des fonctions.

$a = 2;

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

function new_inspect() { 
	$a = 5;
    var_dump($a);
} 
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.

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.

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;
function() use($a) { var_dump($a); }; 
var_dump($a); va afficher 5

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; 
});