Déclaration d'une variable

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.

Assignation

Pour assigner une valeur à une variable, il faut utiliser le signe =

Ex : 

$hello = "Hello World";

$i = 14;

Comment la mémoire fonctionne

En réalité, il existe plusieurs types de mémoire (harddrives, RAM, heap, stack, etc.) mais pour les besoins de l'apprentissage, nous allons simplifier notre façon d'imaginer comment la mémoire fonctionne en général.

comment la mémoire fonctionnePour faire simple, pensons la mémoire comme de nombreux petits "blocs" qui sont proches les uns des autres. Chaque bloc a un nombre (l'adresse mémoire). Si vous définissez une variable dans votre code, la valeur de la variable va être stockée quelque part dans la mémoire (le système d'exploitation va automatiquement décider où placer au mieux cette donnée). L'illustration à droite montre comment on peut représenter un bout de mémoire. Le nombre en gris montre l'adresse du bloc en mémoire alors que le nombre en couleur montre la valeur de stockée.

On comprend donc qu'il y a deux façons de copier des variables : soit par références (gris) soit par copie de la valeur (rouge ou bleu). Dans le premier cas, on n'utilise pas de nouvel espace mémoire alors que dans le deuxième cas, on copie la valeur (couleur) dans un autre espace mémoire.

Animation pour comprendre la différence entre passage par valeur ou par copie

reference vs value

 

Le cas du PHP

Lors d'une assignation en php (=), les variables sont copiées (on copie la valeur et non pas la référence). Une exception au comportement d'affectation par valeur en PHP est le type object, ceux-ci sont affectés par référence. La copie d'objet doit être explicitement demandée grâce au mot-clé clone.

<?php
$jean = "Jean";
$bob = $jean; // passage par valeur, $jean n'est donc pas modifiée si jamais $bob l'était

Pour les passer en référence, il faut utiliser l'instruction "&". Exemple

$bob =& $jean; // passage par référence, $jean sera modifiée si jamais $bob l'était

Portée d'une variable

Le php est "function scope", c'est à dire qu'une variable déclarée dans une fonction sera accessible seulement dans cette fonction. A l'inverse une variable déclarée hors d'une fonction sera globale et donc accessible partout sauf dans des fonctions où il faudra bien spécifier que l'on utilise une variable globale avec le mot clé global ou en utilisant le tableau $GLOBALS

$a = 12; // portée globale
function test() {
  echo "a : " . $a; 
}
test();

Que va afficher l'exécution de ce script php ?

PHP Notice:  Undefined variable: a in 01variables.php on line 4

Pour éviter le message d'erreur :

$a = 12; // portée globale
function test() {
  global $a; // spécifie que $a fait référence à la variable globale $a
  echo "a : " . $a . "\n"; 
}
test();

ou

$a = 12; // portée globale
function test() {
  echo "a : " . $GLOBALS['a'];
}
test();

Variables "static"

Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction. 

Exemple de script n'utilisant pas de variable "static"

function test() {
  $a = 0;  
  $a ++;
  echo "a : " . $a . "\n"; 
}
test();
test();

On comprendre que la variable $a est réinitialisée à zéro, l'incrémentation ($a ++) n'aura donc aucun effet. On peut corriger cela avec le mot clé "static" :

function test() {
  static $a = 0;  
  $a ++;
  echo "a : " . $a; 
}
test();
test();

Maintenant la variable $a n'est plus réinitialisée à zéro et l'incrémentation prend tout son sens.

Vérifier si une variable est définie

la fonction isset détermine si une variable est déclarée et est différente de NULL

Signature : isset ( mixed $var [, mixed $... ] ) : bool

On peut donc passer plusieurs paramètres de n'importe quel type à la fonction et elle renvoie un booléen.

Superglobales

Les Superglobales sont des variables internes qui sont toujours disponibles, quel que soit le contexte.

 

Liste des constantes PHP avec nom réservé : https://www.php.net/manual/fr/reserved.constants.php

Ex d'utilisation d'une constante, PHP_EOL (Le bon symbole de fin de ligne pour en fonction de la plateforme) :

echo PHP_EOL;
echo PHP_EOL.PHP_VERSION.PHP_EOL;

Constante

Il est parfois utile/nécessaire d'utiliser des constantes quand on a besoin d'être sûr qu'une valeur ne changera jamais.

On peut alors utiliser define dont voici la signature :

define( string $name , mixed $value [, bool $case_insensitive = FALSE ] ) : bool

Exemple de déclarations de constantes  :

define('USER', "yvan");
define('PASSWD', "xxxxx");
define('SERVER', "localhost");
define('BASE', "memo");

Utilisation d'une des constantes définie :

echo USER;//yvan

Afficher la valeur l'une variable

echo

echo n'est pas vraiment une fonction (c'est techniquement une structure du langage), vous n'êtes donc pas obligé d'utiliser des parenthèses. echo ne se comporte pas comme une fonction, il ne peut donc pas être utilisé dans le contexte d'une fonction. De même, si vous voulez passer plusieurs paramètres à echo, les paramètres ne doivent pas être entourés de parenthèses.

echo dispose aussi d'une version courte, où vous pouvez faire suivre la balise PHP ouvrante d'un signe égal (=).

Ex : 

<?=$foo?> foo.

var_dump

var_dump() affiche les informations structurées d'une variable, y compris son type et sa valeur. Les tableaux et les objets sont explorés récursivement, avec des indentations, pour mettre en valeur leur structure.

var_dump est donc à privilégier quand on a besoin d'obtenir toutes les informations sur une variable.

Exercice

Ecrire un fichier html (hello.html) dans lequel on appellera :

  • le script helloget.php via un lien en lui passant deux paramètres via la "query string" (firstname = bob et lastname = dylan). 
    helloget.php renvoie du html  avec un message du type "Bonjour bob dylan" (récupérés avec la superglobale $_GET)
     
  • le script hellopost.php via un formulaire de méthode post avec deux paramètres (firstname et lastname).
    hellopost.php renvoie un message du type Bonjour xxx xxxx (récupérés avec la superglobale $_POST). Pour rappel, c'est l'attribut action de la balise form qui permet de spécifier quel script sera appelé côté serveur.